使用 matplotlib 更改小提琴图中单个最大和平均线的颜色

Posted

技术标签:

【中文标题】使用 matplotlib 更改小提琴图中单个最大和平均线的颜色【英文标题】:Change the color of the individual max and mean line in a violin plot using matplotlib 【发布时间】:2021-11-01 10:09:55 【问题描述】:

所以基本上我想改变我情节中每把小提琴的平均线、最小线和最大线的颜色。

我知道我可以通过使用字典来更改情节中所有小提琴的颜色:

violin_parts = ax_lst[0].violinplot(tmp_list, showmedians=True, quantiles=[[0.99], [0.99], [0.99],[0.99]])
for partname in ('cbars','cmins','cmaxes','cmedians','cquantiles'):
        vp = violin_parts[partname]
        vp.set_edgecolor("#3498db")
        vp.set_linewidth(1.6)
        vp.set_alpha(1) 

问题在于,使用这种方法,我无法编辑每把小提琴的单独线条,而且我似乎找不到解决方法。出于某种原因,只有主体本身可以作为所有小提琴的迭代器访问。

【问题讨论】:

matplotlib.org/stable/gallery/statistics/… violin_parts 是一个dict,其值中有matplotlib.collections;好像你会有索引并分配你想要的。该问题未提供完整的minimal reproducible example。 'cbars','cmins','cmaxes','cmeans','cmedians' 只有一个集合,这意味着您将无法单独分配它们。 bodies 是一个集合列表,因此可以单独分配每个集合。 【参考方案1】:

您可以获取小提琴图的集合,并使用 set_color 将其设置为任何小提琴集合。您得到的颜色是一种颜色的列表,因此您可以将其转换为包含您要处理的任何颜色的列表。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.collections import LineCollection

# create test data
np.random.seed(20210903)
data = [sorted(np.random.normal(0, std, 100)) for std in range(1, 5)]

fig, ax = plt.subplots(figsize=(8, 4))

parts = ax.violinplot(data, showmeans=True)

cmax_colors = parts['cmaxes'].get_color()
colors = [cmax_colors[0],'red',cmax_colors[0],cmax_colors[0]]
parts['cmaxes'].set_color(colors)

cmin_colors = parts['cmins'].get_color()
colors = [cmin_colors[0],'red',cmin_colors[0],cmin_colors[0]]
parts['cmins'].set_color(colors)

cmean_colors = parts['cmeans'].get_color()
colors = [cmean_colors[0],'red',cmean_colors[0],cmean_colors[0]]
parts['cmeans'].set_color(colors)

cbar_colors = parts['cbars'].get_color()
colors = [cbar_colors[0],'red',cbar_colors[0],cbar_colors[0]]
parts['cbars'].set_color(colors)

plt.show()

【讨论】:

matplotlib小提琴图颜色统一,所以是冗余代码。我们假设我们可以为每种颜色设置单独的颜色。 谢谢,但是如何改变垂直线呢? 可以使用相同的技术更改中心线。代码和图表已更新。

以上是关于使用 matplotlib 更改小提琴图中单个最大和平均线的颜色的主要内容,如果未能解决你的问题,请参考以下文章

python 在单个图中使用matplotlib绘制多个图像。标题可以任选地作为第二个参数给出。

从 matplotlib 中的颜色图中获取单个颜色

从 matplotlib 中的颜色图中获取单个颜色

Matplotlib 3.3.3:更改单个刻度的颜色不再起作用

如何仅更改 NAN 值 matplotlib 在轮廓图中的颜色

Pandas Matplotlib:如何更改散点图中图例的形状和大小?