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

Change the color of the individual max and mean line in a violin plot using matplotlib

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

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

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) 

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

您可以获得小提琴图的集合,并将其设置为具有 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()