Matplotlib:如何在非透明线边缘处拥有透明的盒子图?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matplotlib:如何在非透明线边缘处拥有透明的盒子图?相关的知识,希望对你有一定的参考价值。

我正在构建一个绘制自定义框图的函数。我希望盒子的表面平坦,透明度很小,我希望每个盒子面周围都有一条薄的实心(不透明)线条。

我在调用matplotlib.pyplot.boxplot之后通过设置框的参数来尝试这个,如下所示。

当我查看要绘制的情节时,它会显示我想要的内容。但是,当我使用matplotlib.pyplot.savefig("output.pdf")创建一个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()

我已经尝试了直方图here的建议,通过设置颜色包括alpha级别[(0, 0, 1, 0.6), (1, 0, 0, 0.6), (0, 1, 0, 0.6)],这似乎不适用于箱形图。

答案

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

另一答案

您可以尝试将facecolor = '#1b9e77'设置为boxprops,这可以是透明色或实色。

plt.boxplot(... , boxprops=dict(facecolor=(0,0,0,0))

以上是关于Matplotlib:如何在非透明线边缘处拥有透明的盒子图?的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib:绘制具有非透明边缘的透明直方图

带有非透明子视图的 iOS 8 透明视图

如何使用 Qt3D 在网格中制作透明线?

在 HTML5 画布中绘制鼠标移动的半透明线

如何在非透明背景上创建透明文本

matplotlib 中 Poly3DCollection 图的透明度