python - 如何在 Pandas 数据框中正确绘制条形图?x 值继续显示为索引
问题描述
我有一个包含 student_id、exam_1、exam_2、exam_3、exam_4 和exam_5 作为列的小数据框。行也有 5 名学生。我想做的是绘制一个条形图,显示一个学生的考试成绩,也就是一个特定的行,并最终从用户输入中为每个或一个特定的学生执行此操作。
不过,就目前而言,我一直停留在如何仅为一个特定学生绘制条形图上。
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'student_id': [83838, 16373, 93538, 29383, 58585],
'exam_1': [80, 95, 90, 75, 50],
'exam_2': [60, 92, 88, 85, 40],
'exam_3': [70, 55, 75, 45, 60],
'exam_4': [55, 95, 45, 80, 55],
'exam_5': [91, 35, 92, 90, 75]})
print(df)
产生这个作为输出:
student_id exam_1 exam_2 exam_3 exam_4 exam_5
0 83838 80 60 70 55 91
1 16373 95 92 55 95 35
2 93538 90 88 75 45 92
3 29383 75 85 45 80 90
4 58585 50 40 60 55 75
在下面添加此代码将允许我只选择一个特定的学生 ID aka 行:
df = df.loc[df['student_id'] == 29383]
print(df)
student_id exam_1 exam_2 exam_3 exam_4 exam_5
3 29383 75 85 45 80 90
从这里我想在条形图中绘制这个特定学生的考试。
我尝试了下面的代码,但它没有显示我想要的样子。如果您能看到图像,似乎这个特定学生的索引被用于 x 轴上的刻度。它将显示“3”,周围有一些条形图。
exam_plots_for_29383 = df.plot.bar()
plt.show()
这将输出这个条形图: 带条形图的数据框。看起来很奇怪。
我试图转置数据框,这让我得到了我想要的。我在下面使用了这段代码:
df = df.T
exam_plots_for_29383_T = df.plot.bar()
plt.show()
但我最终将其作为图表: Transpose of dataframe with bar plot。看起来还是很奇怪。
我有点卡住了。我知道有一种从数据框中正确绘制条形图的合乎逻辑的方法,但我一生都无法弄清楚。
我希望条形图具有:
- 检查 1 到 5 显示在 x 轴上。
- 它们在 y 轴上的值。
- 每个考试栏都有不同的颜色。
- 显示颜色的图例。
我认为最后两个选项是自动完成的。只是前两个让我心碎。我感谢任何帮助或提示。
这是完整的代码,以防有人希望看到它而不像上面那样拆分它。
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'student_id': [83838, 16373, 93538, 29383, 58585],
'exam_1': [80, 95, 90, 75, 50],
'exam_2': [60, 92, 88, 85, 40],
'exam_3': [70, 55, 75, 45, 60],
'exam_4': [55, 95, 45, 80, 55],
'exam_5': [91, 35, 92, 90, 75]})
print(df)
df = df.loc[df['student_id'] == 29383]
print(df)
exam_plots_for_29383 = df.plot.bar()
plt.show()
df = df.T
exam_plots_for_29383_T = df.plot.bar()
plt.show()
解决方案
你很亲密。问题是您的类似数字的学生 ID 弄乱了所有图表(这就是为什么 ID 29383 在您的所有图表中为您提供了一个接近 30,000 的条形图)。
将“student_id”设置为索引,这样它就不会被绘制出来,现在您可以绘制每个学生分别用 切片索引.loc[student_id]
,或者如果您绘制整个 DataFrame,它将为每个不同的学生着色。
df = df.set_index('student_id')
df.loc[29383].plot(kind='bar', figsize=(4,3), rot=30)
知道有 5 个考试,如果你真的想要,你可以给每个考试自己的颜色。使用分类调色板 (tab10)。(这也只适用于 Series.plot)
from matplotlib import cm
df.loc[29383].plot(kind='bar', figsize=(4,3), rot=30, color=cm.tab10.colors[0:5])
推荐阅读
- office-js - 获取用户编辑excel文档的信息
- pandas - pandas 所有指数的平均 bin 值
- java - Spring boot JPA - 延迟加载不适用于一对一映射
- powershell - 在 PowerShell 中使用 Where-Object 计数过滤 (xml-)Data ...
- php - array_column 在 PHP 5.6 中返回空数组
- python - 抽象 DGRAM 套接字,C 服务器和 Python 客户端,连接被拒绝
- java - 如何从 guava cacheloader 获取缓存的值并更新值而不更改缓存中的值?
- java - 如何根据列值向arraylist显示数据
- tableau-api - 如何计算 Tableau 中多列中的 Null 和 Not Null 记录
- angular - 带有 ng-template 的 ReactiveForm