Python 使用Seaborn条形图分离(并保留)重复的分类数据?

Python 使用Seaborn条形图分离(并保留)重复的分类数据?,python,pandas,matplotlib,seaborn,Python,Pandas,Matplotlib,Seaborn,我想画一些假设的学生考试分数。我希望学生的姓氏在y轴上,考试成绩在x轴上(水平条形图)。因为学生的名字是非唯一的,所以我想允许在y轴上重复。我已经看到了消除海洋生物和/或熊猫中重复数据的方法,但没有看到如何保存重复数据。以下是我的代码: import seaborn as sns import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt sns.set(style="whitegrid") sco

我想画一些假设的学生考试分数。我希望学生的姓氏在y轴上,考试成绩在x轴上(水平条形图)。因为学生的名字是非唯一的,所以我想允许在y轴上重复。我已经看到了消除海洋生物和/或熊猫中重复数据的方法,但没有看到如何保存重复数据。以下是我的代码:

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”,但这会产生一个“紧凑布局”警告,实际上,是一个紧凑/渲染不好的绘图


仅供参考,目前我有一个看起来不错的条形图,但它对非唯一的姓氏进行分组,并对他们的考试成绩进行汇总;这就是我想要解决的问题

您可以为每个唯一行绘制一个条形图(使用索引作为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
就足够了(只需导入seaborn即可获得美观的绘图)


您是否试图显示两个重复姓氏栏?如果您发布了样本数据,这会有所帮助。阅读如何创建一个。我可以尝试制作与您的代码和描述相匹配的样本数据,但这会花费我时间,最好花在实际解决问题上,我可能会误解您,并编写一个无用的答案。我将发布一个稍微糟糕的版本。干得好。嘿,@Igor,这似乎是一个很好的解决方案。但是,读取一个大的csv文件并将分数按升序排序会带来任何问题吗?@Janine,读取/排序数据和绘制数据是两个正交的任务。您可以使用这两种方法中的任何一种,以任意顺序绘制数据。
plt.barh(df.index, df.score, align='center')
plt.yticks(df.index, df.name)
plt.gca().invert_yaxis()