Matplotlib:如何在箱线图的面部具有透明度,同时线条边缘不透明?

6
我正在编写一个绘制自定义箱线图的函数。我想让箱子的面部是平的,并略带透明度,我想要每个箱子面周围有一条细实线(非透明)。
我一直试图在调用matplotlib.pyplot.boxplot之后通过设置箱的参数来实现此目的,如下所示。
当我将绘图查看到屏幕上时,它显示了我想要的样子。但是,当我创建一个pdf文件,例如matplotlib.pyplot.savefig("output.pdf")时,该线不是实心的,也是透明的。当我放大pdf文件时,这种透明度就会变得明显。
有人知道如何使线条保持不透明,同时保持箱形图面的透明度吗?
先谢谢了。
from matplotlib import pyplot as plt
import numpy as np

data = {}
data['a'] = np.arange(12)+1
data['b'] = np.arange(14)+1
data['c'] = np.arange(8)+1

cols = ['red', 'blue', 'green']

controls = ['trt_a', 'trt_b', 'trt_c']

fig, ax = plt.subplots()

boxplot_dict = ax.boxplot([data[x] for x in ['a', 'b', 'c']], \
    positions = [1, 1.5, 2], labels = controls, \
    patch_artist = True, widths = 0.25)

for b, c in zip(boxplot_dict['boxes'], cols):
    b.set_alpha(0.6)
    b.set_edgecolor(c) # or try 'black'
    b.set_facecolor(c)
    b.set_linewidth(1)

ax.set_ylim([0,16])

plt.savefig("test_boxplot.pdf")
plt.close()

我尝试了在这里给出的直方图建议,通过将颜色设置为包含alpha级别[(0, 0, 1, 0.6), (1, 0, 0, 0.6), (0, 1, 0, 0.6)],但似乎对于箱线图无效。

3个回答

5

set_alpha 函数会同时改变面颜色和边缘颜色,如果要避免这种情况,可以直接传递 RGBA 值给面颜色:

#cols = ['red', 'blue', 'green']
cols = [[1,0,0,0.5],
        [0,1,0,0.5],
        [0,0,1,0.5]]

controls = ['trt_a', 'trt_b', 'trt_c']

fig, ax = plt.subplots()

boxplot_dict = ax.boxplot([data[x] for x in ['a', 'b', 'c']], \
    positions = [1, 1.5, 2], labels = controls, \
    patch_artist = True, widths = 0.25)

for b, c in zip(boxplot_dict['boxes'], cols):
    #b.set_alpha(0.6)
    b.set_edgecolor('k') # or try 'black'
    b.set_facecolor(c)
    b.set_linewidth(1)

enter image description here


4
你可以尝试设置facecolor = '#1b9e77'作为boxprops的颜色,这可以是透明的颜色或实心的颜色。
plt.boxplot(... , boxprops=dict(facecolor=(0,0,0,0))

0

如果您只想使箱线图透明,可以将fill设置为None

plt.boxplot(..., boxprops={'fill': None}

这些方框是 PathPatch 对象,因此可以将任何相应的关键字参数传递给 boxprops。这也适用于 Seaborn 的箱线图函数, 它会将关键字参数传递给 matplotlib。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接