matplotlib 如何制作多色海运线测图

zz2j4svz  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(116)

我有一个包含键值对的字典:

COLORS= {'fish':'blue','tigers':'orange'}

和数据:

team  value  
0 fish   20
1 fish   15
2 fish   10
3 tigers 7
4 tigers 13
5 tigers 15

我想做一个线图,并使用.get()方法来获得每个团队的颜色,并相应地为线图着色(线的前三个一半是蓝色,后一半是橙子)
我尝试使用以下代码:

sns.lineplot(data = df, x = np.arange(len(df)), y = value, color=COLORS.get(df.team)

但我得到了错误

TypeError: 'Series' objects are mutable, thus they cannot be hashed

我可以用下面的代码让它工作

...color=COLORS[df.team.iloc[0]]

但是这使得整个线图成为第一个出现的颜色,在这种情况下是蓝色的。同样,我想根据team给线图着色,我不确定为什么.get()不起作用。有什么想法吗?

woobm2wo

woobm2wo1#

.get()不起作用,因为你在dictionary对象上调用它,但传递的是pandas.Series对象。
如果你传递一个你正在搜索的值,它将工作。(如果你需要进一步的解释,请参阅这篇文章)
你通过传递COLORS[df.team.iloc[0]]来完成,但它只传递一个值,即第一个团队,这就是为什么你得到一种颜色的整个图。
我将DataFrame按团队分组,然后将分组的DataFrame重新分组,并为每个团队绘制一条新线。现在您可以在COLORS字典上使用.get()函数并获得正确的颜色。
看看这是否对你有帮助:

df = pd.DataFrame(data=data)
gk = df.groupby("team")
x = np.arange(len(df))
index = 0
for team_name, team_group in gk:
    sns.lineplot(
        x=x[index : index + len(team_group)],
        y=team_group.value,
        color=COLORS.get(team_name),
    )
    index += len(team_group)
plt.show()

相关问题