【问题标题】:How to change edgecolor according to value of a dataframe如何根据数据框的值更改边缘颜色
【发布时间】:2021-12-04 11:14:07
【问题描述】:

我想绘制“LapTimeSeconds”与“Driver”的 Seaborn swarmplot,我希望每个 swarm(驱动程序)都以“颜色”列中的相应颜色绘制,我还想要边缘颜色每个标记都是给定的'Compound_colour'

我有一个数据框 df,看起来像:

Driver   Colour  LapNumber   LapTimeSeconds   Compound   Compound_colour
HAM    #00d2be       2          91.647      MEDIUM         #ffd300
HAM    #00d2be       5          91.261      MEDIUM         #ffd300
HAM    #00d2be       8          91.082        SOFT         #FF3333
VER    #0600ef       3          91.842      MEDIUM         #ffd300
VER    #0600ef       6          91.906      MEDIUM         #ffd300
NOR    #ff8700       10         90.942        SOFT         #FF3333

这是我目前拥有的一些代码。

sns.set_palette(df['Colour'].unique().tolist())

ax = sns.boxplot(x="Driver", y="LapTimeSeconds", data=df, width = 0.8, color = 'white')

ax = sns.swarmplot(x="Driver", y="LapTimeSeconds", data=df,  size = 9, linewidth=1)

这给出了一个看起来像这样的情节

但是,我希望每个标记的边缘颜色为相应的“Compound_colour”,例如化合物为“中等”我希望边缘颜色为“#ffd300”(黄色)且化合物为“软” ' 我希望边缘颜色为 '#FF3333'(红色)。

这与我的目标相似。有没有办法做到这一点?

【问题讨论】:

标签: python pandas matplotlib seaborn


【解决方案1】:

要自定义 swarmplot 中的每个标记,请设置指定的颜色,因为它可以从集合中获取。此外,要更改每个箱线图的颜色,请更改 line 对象的颜色,因为它包含在 ax.artists 中。

import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import colors

sns.set_palette(df['Colour'].unique().tolist())
fig,ax = plt.subplots()

ax =sns.boxplot(x="Driver", y="LapTimeSeconds", data=df, width=0.8, color='white')
swarm = sns.swarmplot(x="Driver", y="LapTimeSeconds", data=df, size=9, linewidth=1)

swarm.collections[0].set_ec(colors.to_rgba('#ffd300', 1.0))
swarm.collections[1].set_ec(colors.to_rgba('#FF3333', 1.0))
swarm.collections[2].set_ec(colors.to_rgba('#FF3333', 1.0))
swarm.collections[0].set_edgecolors(['#FF3333','#ffd300','#ffd300'])

colors = ['#00d2be','#0600ef','#ff8700']

for i, artist in enumerate(ax.artists):
    # print(i, artist)
    artist.set_edgecolor(colors[i])
    for j in range(i*6,i*6+6):
        line = ax.lines[j]
        line.set_color(colors[i])
        line.set_mfc(colors[i])
        line.set_mec(colors[i])

plt.show()

【讨论】:

  • 这是一个很棒的answer,我已经解决了您的问题。如果我的回答对你有帮助,请采纳。有关接受的更多信息,请参阅this
  • 感谢您的回复,不幸的是这不是我想要的。在这个例子中,edgecolor 被设置为每个 swarm 一个特定的值。但是,我希望每个群体有几个值,例如对于“HAM”,“Compound_colour”的值为“#ffd300、#ffd300、#FF3333”。有没有办法简单地实现这个?
  • swarm.collections 中存储了绘制的标记,因此如果您想为每个标记赋予不同的颜色,可以通过指定任何颜色来实现。答案代码和图表已更新。
猜你喜欢
  • 2022-01-13
  • 2016-11-29
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
相关资源
最近更新 更多