Python 如何在数据框中正确绘制条形图?x值一直显示为索引
我有一个小数据框,其中学生id、考试1、考试2、考试3、考试4和考试5作为列。排成一排的还有5名学生。我想做的是绘制一个条形图,显示一个学生的考试成绩,也就是一个特定的行,并最终根据用户输入为每个学生或一个特定的学生绘制 不过现在,我一直在研究如何为一个特定的学生绘制条形图Python 如何在数据框中正确绘制条形图?x值一直显示为索引,python,pandas,Python,Pandas,我有一个小数据框,其中学生id、考试1、考试2、考试3、考试4和考试5作为列。排成一排的还有5名学生。我想做的是绘制一个条形图,显示一个学生的考试成绩,也就是一个特定的行,并最终根据用户输入为每个学生或一个特定的学生绘制 不过现在,我一直在研究如何为一个特定的学生绘制条形图 import pandas as pd import matplotlib.pyplot as plt df = pd.DataFrame({'student_id': [83838, 16373, 93538, 2938
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,即行:
df = df.loc[df['student_id'] == 29383]
print(df)
从这里开始,我想把这个学生的考试画成条形图
我尝试了下面的代码,但它没有显示我想要的方式。如果你能看到图片,这个学生的索引似乎被用于x轴上的刻度。它将显示“3”,周围有一些条形图
exam_plots_for_29383 = df.plot.bar()
plt.show()
将输出此条形图:
我试着转置数据帧,这让我得到了我想要的。我使用了以下代码:
df = df.T
exam_plots_for_29383_T = df.plot.bar()
plt.show()
但我最终以图表的形式得出:
我有点卡住了。我知道有一种从数据框中正确绘制条形图的逻辑方法,但我一辈子都搞不懂
我希望条形图有:
- 检查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在你所有的图中给你一个接近30000的条) 将“student_id”设置为索引,这样就不会打印,现在您可以使用
.loc[student_id]
将索引切片,单独打印每个学生,或者如果您打印整个数据帧,它将为每个不同的学生着色
df = df.set_index('student_id')
df.loc[29383].plot(kind='bar', figsize=(4,3), rot=30)
知道有5种考试,如果你真的想,你可以给每一种考试自己的颜色。使用分类调色板(表10)。(这也仅适用于Series.plot)
@anky这和我要找的东西非常接近!我真的很喜欢这个,因为它很有用!但是,我不想让每个勾号都是学生ID,所有的考试(1、2、3、4、5)都是条形图,我希望总体图是一个特定学生考试的条形图。所以底部的刻度是“考试1、考试2、考试3、考试4、考试5”,每个考试的分数是y值。我觉得我每次都离得很近,但我还是错过了一些东西。就是这样!非常感谢你。出于某种原因,起初它似乎并不那么直观。对数据进行更好的结构化会使其更容易吗?例如,我第一次打印出的数据框起初似乎是合乎逻辑的,以学生id和考试1-5作为列,直到我决定将其绘制成图形。我的想法是每个新学生和他们的考试成绩可以添加为行。我想让我陷入困境的是,把它当作Excel表格,然后用这种方式制作数据框架。@GregGoodbread组织很好。我对解决方案做了一些修改,使其保持原样,它只需要设置索引,然后用.loc选择一行,而不是转置
df = df.set_index('student_id')
df.loc[29383].plot(kind='bar', figsize=(4,3), rot=30)
from matplotlib import cm
df.loc[29383].plot(kind='bar', figsize=(4,3), rot=30, color=cm.tab10.colors[0:5])