【问题标题】:assign a color to a specific box in seaborn.boxplot为 seaborn.boxplot 中的特定框分配颜色
【发布时间】:2016-03-30 10:09:01
【问题描述】:

我大致如下调用 seaborn.boxplot:

   seaborn.boxplot(ax=ax1,
                    x="centrality", y="score", hue="model", data=data], 
                    palette=seaborn.color_palette("husl", len(models) +1),
                    showfliers=False, 
                    hue_order=order,
                    linewidth=1.5)

是否可以通过给一个盒子赋予特定的颜色来使其脱颖而出,同时使用给定的调色板为所有其他盒子着色?

【问题讨论】:

标签: matplotlib plot seaborn


【解决方案1】:

使用sns.boxplot 制作的盒子实际上只是matplotlib.patches.PathPatch 对象。这些作为列表存储在ax.artists 中。

因此,我们可以通过索引ax.artists 来特别选择一个框。然后,您可以设置facecoloredgecolorlinewidth 以及许多其他属性。

例如(基于示例之一here):

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_style("whitegrid")
tips = sns.load_dataset("tips")
ax = sns.boxplot(x="day", y="total_bill", hue="smoker",
                 data=tips, palette="Set3")

# Select which box you want to change    
mybox = ax.artists[2]

# Change the appearance of that box
mybox.set_facecolor('red')
mybox.set_edgecolor('black')
mybox.set_linewidth(3)

plt.show()

【讨论】:

  • 你会如何改变胡须和平均颜色? mybox.set_whiskercolor() 不起作用
  • 胡须、大写字母和中线都存储在ax.lines 中。通过反复试验,您可以找到哪条线对应于您要更改的平均值,然后执行 ax.lines[X].set_color('blue') 或类似操作(其中 X 是您要更改的线的索引)
  • 更详细一点:每个框有 5 行与之关联。所以ax.lines[0:5] 对应第一个框,ax.lines[5:11] 对应第二个框,以此类推。ax.lines[0:2] 将改变胡须,ax.lines[2:4] 将改变大写,ax.lines[4] 将改变第一个框的均线
  • 太棒了,效果非常好
猜你喜欢
  • 2020-12-03
  • 2019-09-17
  • 2016-05-14
  • 2018-03-21
  • 2019-10-22
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多