Python Matplotlib 箱线图颜色

Posted

技术标签:

【中文标题】Python Matplotlib 箱线图颜色【英文标题】:Python Matplotlib Boxplot Color 【发布时间】:2017-06-19 05:53:42 【问题描述】:

我正在尝试使用 Matplotlib 制作两组箱线图。我希望用不同的颜色填充每组箱线图(以及点和胡须)。所以基本上剧情上会有两种颜色

我的代码在下面,如果你能帮助制作这些彩色图,那就太好了。 d0d1 是每个数据列表的列表。我想要用d0 中的数据以一种颜色制作的箱线图集,以及用d1 中的数据以另一种颜色制作的箱线图集。

plt.boxplot(d0, widths = 0.1)
plt.boxplot(d1, widths = 0.1)

【问题讨论】:

Matplotlib 对 documentation 非常有帮助。 【参考方案1】:

要为箱线图着色,您需要首先使用patch_artist=True 关键字告诉它箱是补丁,而不仅仅是路径。那么这里有两个主要选项:

    通过...props关键字参数设置颜色,例如boxprops=dict(facecolor="red")。对于所有关键字参数,请参阅the documentation 使用plt.setp(item, properties) 功能设置方框、胡须、传单、中位数、大写字母的属性。 从返回的字典中获取盒子的各个项目,并在它们上单独使用item.set_<property>(...)。此选项在以下问题的答案中有详细说明:python matplotlib filled boxplots,它允许单独更改各个框的颜色。

完整示例,显示选项 1 和 2:

import matplotlib.pyplot as plt
import numpy as np
data = np.random.normal(0.1, size=(100,6))
data[76:79,:] = np.ones((3,6))+0.2

plt.figure(figsize=(4,3))
# option 1, specify props dictionaries
c = "red"
plt.boxplot(data[:,:3], positions=[1,2,3], notch=True, patch_artist=True,
            boxprops=dict(facecolor=c, color=c),
            capprops=dict(color=c),
            whiskerprops=dict(color=c),
            flierprops=dict(color=c, markeredgecolor=c),
            medianprops=dict(color=c),
            )


# option 2, set all colors individually
c2 = "purple"
box1 = plt.boxplot(data[:,::-2]+1, positions=[1.5,2.5,3.5], notch=True, patch_artist=True)
for item in ['boxes', 'whiskers', 'fliers', 'medians', 'caps']:
        plt.setp(box1[item], color=c2)
plt.setp(box1["boxes"], facecolor=c2)
plt.setp(box1["fliers"], markeredgecolor=c2)


plt.xlim(0.5,4)
plt.xticks([1,2,3], [1,2,3])
plt.show()

【讨论】:

感谢您的出色回答。次要的挑剔:“那么您在这里有两个主要选择” ...然后您列出了 3 :-) 。这让我想起了一个笑话“四个使徒是以下三个:彼得和保罗”(抱歉无法抗拒) 再次突出显示:添加patch_artist=True 非常重要,否则框将是Line2Ds 而不是Patchs,在这种情况下,您不能为它们设置面部颜色,因为它们是只是线条。【参考方案2】:

您可以对来自boxplot() 的返回值使用setp 更改箱形图的颜色。此示例定义了一个 box_plot() 函数,该函数允许指定边缘和填充颜色:

import matplotlib.pyplot as plt

def box_plot(data, edge_color, fill_color):
    bp = ax.boxplot(data, patch_artist=True)
    
    for element in ['boxes', 'whiskers', 'fliers', 'means', 'medians', 'caps']:
        plt.setp(bp[element], color=edge_color)

    for patch in bp['boxes']:
        patch.set(facecolor=fill_color)       
        
    return bp
    
example_data1 = [[1,2,0.8], [0.5,2,2], [3,2,1]]
example_data2 = [[5,3, 4], [6,4,3,8], [6,4,9]]

fig, ax = plt.subplots()
bp1 = box_plot(example_data1, 'red', 'tan')
bp2 = box_plot(example_data2, 'blue', 'cyan')
ax.legend([bp1["boxes"][0], bp2["boxes"][0]], ['Data 1', 'Data 2'])
ax.set_ylim(0, 10)
plt.show()

这将显示如下:

【讨论】:

您错过了传单的markeredgecolor。 ;-) 感谢您的帮助 :-) 如何为蓝色箱线图添加标签和为棕色箱线图添加标签? 函数返回的bp可以用来调用ax.legend(),我已经更新了例子来告诉你如何【参考方案3】:

这个问题似乎和那个问题相似 (Face pattern for boxes in boxplots) 我希望这段代码能解决你的问题

import matplotlib.pyplot as plt

# fake data
d0 = [[4.5, 5, 6, 4],[4.5, 5, 6, 4]]
d1 = [[1, 2, 3, 3.3],[1, 2, 3, 3.3]]

# basic plot
bp0 = plt.boxplot(d0, patch_artist=True)
bp1 = plt.boxplot(d1, patch_artist=True)

for box in bp0['boxes']:
    # change outline color
    box.set(color='red', linewidth=2)
    # change fill color
    box.set(facecolor = 'green' )
    # change hatch
    box.set(hatch = '/')

for box in bp1['boxes']:
    box.set(color='blue', linewidth=5)
    box.set(facecolor = 'red' )

plt.show()

【讨论】:

如何更改单个箱线图的填充?例如,如何为bp0bp1 设置两种不同的填充颜色? 没关系,我使用文档tutorial解决了我的问题。【参考方案4】:

改变箱线图的颜色

import numpy as np 
import matplotlib.pyplot as plt

#generate some random data
data = np.random.randn(200)
d= [data, data]
#plot
box = plt.boxplot(d, showfliers=False)
# change the color of its elements
for _, line_list in box.items():
    for line in line_list:
        line.set_color('r')

plt.show()

【讨论】:

奇怪的是只有这个解决方案对我有用。我认为这对于较旧的 matplotlib 版本是必需的。 (1.3.1 版适用于此)。

以上是关于Python Matplotlib 箱线图颜色的主要内容,如果未能解决你的问题,请参考以下文章

python matplotlib 同时画箱线图和折线图的问题

没有异常值的 Matplotlib 箱线图

python3绘图示例4(基于matplotlib:箱线图散点图等)

Matplotlib 箱线图使用预先计算(汇总)统计

使用 Matplotlib 创建箱线图

使用 matplotlib 向箱线图添加点散点图