Python 如何在数据框中正确绘制条形图?x值一直显示为索引

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

我有一个小数据框,其中学生id、考试1、考试2、考试3、考试4和考试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,即行:

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])