使用 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 3.3.3:更改单个刻度的颜色不再起作用