首页 > 解决方案 > 如何在 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。看起来还是很奇怪。

我有点卡住了。我知道有一种从数据框中正确绘制条形图的合乎逻辑的方法,但我一生都无法弄清楚。

我希望条形图具有:

我认为最后两个选项是自动完成的。只是前两个让我心碎。我感谢任何帮助或提示。

这是完整的代码,以防有人希望看到它而不像上面那样拆分它。

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

标签: pythonpandas

解决方案


你很亲密。问题是您的类似数字的学生 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])

在此处输入图像描述


推荐阅读