【问题标题】:Set boxplot 'boxes' facecolor transparency in Python matplotlib在 Python matplotlib 中设置 boxplot 'boxes' facecolor 透明度
【发布时间】:2023-07-04 08:51:01
【问题描述】:

我正在寻找一种方法来设置箱线图 facecolor 的透明度。现在它显示为“红色”,alpha=1。例如,如何将其更改为 alpha 为 0.5 的“红色”,同时保持框边缘颜色不透明的“黑色”?我只想要 facecolor 的透明度,而不是 edgecolor。 有什么想法吗?

试用过的代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.colors as cls
import matplotlib

matplotlib.interactive(True)

df = pd.DataFrame({"A": [18,28,29,32,35,36,37,37,39,40,42,42,46,48,54,56,57,61,61,62,63,65],
                   "B":  [9,13,17,15,23,21,24,28,26,30,29,30,38,42,40,48,40,51,54,50,51,57],
                   "C": [1,98,65,47,58,95,24,5,63,7,41,5,6,84,56,96,33,25,61,94,68,83]})

columns = ['A', 'B']
df_data = df.loc[:, columns]

def boxplot(y_lims, y_lime):
    plt.figure(figsize=((12.0 / 2.54), (7.42 / 2.54)), facecolor=None, edgecolor='black')  
    fig, ax = plt.subplots() 
    boxprops = dict(linestyle='-', linewidth=0.6)  
    bp = df_data.boxplot(ax=ax, grid=False, showfliers=False, boxprops=boxprops, showmeans=True, return_type='dict', patch_artist=True)
    [patch.set(facecolor='red', alpha=1.0) for patch in bp['boxes']]   #if alpha=0.5; both face and edge color are transparent, I only want the facecolor to be transparent 
    [patch.set_edgecolor('black') for patch in bp['boxes']]
    [item.set_color('black') for item in bp['whiskers']]
    [item.set_color('black') for item in bp['caps']]
    [item.set_marker('.') for item in bp['means']]
    [item.set_markerfacecolor('black') for item in bp['means']]
    [item.set_markeredgecolor('black') for item in bp['means']]
    [item.set_color('black') for item in bp['medians']]

    ax.set_ylim(y_lims, y_lime)    
    plt.show()


if __name__ == '__main__':

    Boxplot_a = boxplot(None, None)

注意: - rgba-colors 没有起到作用,由于某种原因无法识别 alpha

【问题讨论】:

  • 如果你使用 matplotlibs boxplot,RGBA 可以工作,如this answer 所示。由于某种原因,使用 pandas boxplot 不起作用。我不知道为什么......
  • 是的,我想我避免直接​​使用 matplotlib boxplot,因为 pandas boxplot 可以有效地处理 NaN 值,而 matplotlib.boxplot 没有。当我将数据点读入数据框时,pandas 解决方案很容易采用。不知道为什么它不适用于 RGBA 值..

标签: python pandas matplotlib transparency


【解决方案1】:

一旦为整个路径补丁设置了alpha,RGBA 边缘和面颜色中可能的 alpha 值将被忽略。 Pandas sets alpha to 1 内部。

因此,为了使其正常工作,您需要将 alpha 重新设置为 None,然后根据需要在颜色中指定 alpha 通道(例如,0.5 用于面部,1 用于边缘颜色):

[patch.set(alpha=None, facecolor=(1,0,0,.5)) for patch in bp['boxes']]

编辑:这已经是fixed 并将在版本1.1.0 中可用(第三项here)。然后你可以简单地做

boxprops = dict(linestyle='-', linewidth=0.6, facecolor=(1,0,0,.5), edgecolor='k')

(之后无需更改补丁)

【讨论】:

    【解决方案2】:

    set_alpha 同时改变面颜色和边缘颜色,为避免这种情况,您可能需要考虑将 RGBA 值直接传递给面颜色。

    【讨论】:

    • 我已经尝试过了,但是没有用。在此处使用 RGBA 指定 A 值时,它似乎对 A 值没有任何作用