Seaborn中的黑白箱线图

24

我正在尝试使用Python的Seaborn软件包绘制多个黑白箱形图。默认情况下,这些图表使用彩色调色板。我希望将它们绘制成实心黑色轮廓。我能想出的最好办法是:

我试图使用 Python 的 Seaborn 软件包绘制多个黑白箱线图。默认情况下,这些图使用颜色调色板。我希望以纯黑色轮廓绘制它们。我所能想到的最好方法是:

# figure styles
sns.set_style('white')
sns.set_context('paper', font_scale=2)
plt.figure(figsize=(3, 5))
sns.set_style('ticks', {'axes.edgecolor': '0',  
                        'xtick.color': '0',
                        'ytick.color': '0'})

ax = sns.boxplot(x="test1", y="test2", data=dataset, color='white', width=.5)
sns.despine(offset=5, trim=True)
sns.plt.show()

这将产生类似于:

在此输入图片描述

我希望盒子轮廓为黑色,没有填充或颜色调色板中的任何变化。

2个回答

32

我只是在探索这个问题,现在似乎有另一种方法可以实现。基本上,有关键字boxpropsmedianpropswhiskerprops和(你猜对了)capprops,它们都是可以传递给箱形图函数的字典。我选择在上面定义它们,然后解包以提高可读性:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

_to_plot = pd.DataFrame(
    {
     0: np.random.normal(0,1,100),
     1: np.random.normal(0,2,100),
     2: np.random.normal(0,-1,100),
     3: np.random.normal(0,-2,100)
     }
).melt()

PROPS = {
    'boxprops':{'facecolor':'none', 'edgecolor':'red'},
    'medianprops':{'color':'green'},
    'whiskerprops':{'color':'blue'},
    'capprops':{'color':'yellow'}
}

sns.boxplot(x='variable',y='value',
            data=_to_plot,
            showfliers=False,
            linewidth=0.75, 
            **PROPS)

输入图片描述


1
例如,如何为0和1指定两种不同的颜色。即使面颜色为“无”,我们仍希望第一个完全是红色,第二个完全是蓝色。 - Simon Chemnitz-Thomsen
这太棒了,谢谢。 - mitoRibo
@SimonChemnitz-Thomsen 我认为您可能需要使用补丁艺术家方法,在绘图后循环遍历每个框。有一些关于编辑特定框/数据点的SO帖子,这可能有所帮助,但我没有做过,所以无法提供帮助。 - fffrost

24

您需要设置每个框的edgecolor,并使用set_color为与每个框相关联的六条线(whiskers和median)设置颜色:

ax = sns.boxplot(x="day", y="total_bill", data=tips, color='white', width=.5, fliersize=0)

# iterate over boxes
for i,box in enumerate(ax.artists):
    box.set_edgecolor('black')
    box.set_facecolor('white')

    # iterate over whiskers and median lines
    for j in range(6*i,6*(i+1)):
         ax.lines[j].set_color('black')

如果应用于所有艺术家和线路,则上一个周期可以缩短为:
plt.setp(ax.artists, edgecolor = 'k', facecolor='w')
plt.setp(ax.lines, color='k')

根据箱线图ax 的位置。

enter image description here

如果您还需要设置传单的颜色,请按照answer中的说明进行操作。

1
如果你想要变得真正极简主义,你可以这样写:showbox=False. - mwaskom
1
由于此问题:https://github.com/matplotlib/matplotlib/issues/20895,您可能需要使用以下代码:`for i,box in enumerate(ax.patches):` - Xin Niu

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