我试图绘制一些假设的学生测试分数。我希望在y轴上有学生姓氏,并在x轴(水平条形图)上测试分数。由于学生姓名不是唯一的,我希望在y轴上允许重复。我已经看到了摆脱seaborn和/或pandas中重复数据的方法,但不知道如何保留。这是我的代码:
import seaborn as sns
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
sns.set(style="whitegrid")
scores = pd.read_csv('input_file.csv', sep=',').sort_values("score", ascending=True)
sns.set_color_codes("pastel")
sns.barplot(x="score", y="lastName", data=scores, color="b", ci=None)
plt.title('Scores')
sns.despine(left=True, bottom=True)
plt.savefig('path_to_file.pdf')
我想也许我应该使用factorplot并将方向设置为" h"并输入" bar"但这产生了严格的布局"警告,实际上是一个严密/严重渲染的情节。
仅供参考,目前我有一个看起来很漂亮的条形图,但它将非独特的姓氏分组并总结他们的考试成绩;这就是我想要解决的问题。
答案 0 :(得分:3)
您可以为每个唯一行绘制一个条形图(使用索引作为y坐标),然后手动指定y轴刻度标签。
df = pd.DataFrame({
'name': ['A', 'B', 'A', 'B'],
'score': [10, 20, 30, 40],
})
ax = sns.barplot(x=df.score, y=df.index, orient='h')
ax.set_yticklabels(df.name)
请注意,对于这项任务,Seaborn可能实际上是矫枉过正;你没有进行任何统计可视化。由于您不需要对非唯一值进行分组并显示置信区间,因此matplotlib.pyplot.barh
就足够了(只有import seaborn
才能获得漂亮的图表。)
plt.barh(df.index, df.score, align='center')
plt.yticks(df.index, df.name)
plt.gca().invert_yaxis()