python - 更改 pandas boxplot 子图中各个框的颜色

标签 python pandas dataframe matplotlib boxplot

这是引用以下问题,其中讨论了调整标题和子图布局的选项: modify pandas boxplot output

我的要求是更改每个子图中各个框的颜色(如下所示):

Something like this

以下是共享链接中可用于调整子图的标题和轴属性的代码:

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

df = pd.DataFrame(np.random.rand(140, 4), columns=['A', 'B', 'C', 'D'])
df['models'] = pd.Series(np.repeat(['model1','model2', 'model3', 'model4',     'model5', 'model6', 'model7'], 20))
bp = df.boxplot(by="models",layout=(4,1),figsize=(6,8))
[ax_tmp.set_xlabel('') for ax_tmp in np.asarray(bp).reshape(-1)]
fig = np.asarray(bp).reshape(-1)[0].get_figure()
fig.suptitle('New title here')
plt.show()

我尝试使用: ax.set_facecolor('颜色') 属性,但未成功获得所需的结果。

我也尝试访问 bp['boxes'] 但显然它不可用。我需要了解存储在 bp 中的数据结构,以便访问子图中的各个框。

期待

P.S:我知道 seaborn。但目前需要使用 df.boxplot 来理解和实现。谢谢

最佳答案

要调整 pandas.boxplot 中框的颜色,您必须稍微调整代码。首先,您必须告诉 boxplot 用一种颜色实际填充方框。您可以通过指定 patch_artist = True 来执行此操作,如文档中所述 here .但是,您似乎无法指定颜色(默认为蓝色)——如果我错了,请任何人纠正我。这意味着您之后必须更改颜色。幸运的是,pandas.boxplot 提供了一个简单的选项,通过指定 return_type = 'both' see here 将箱线图中的艺术家作为返回值。寻求解释。您得到的是一个 pandas.Series,其键根据您的 DataFrame 列和值,这些值是包含箱线图所在的 Axes 实例的元组绘制和字典中箱线图的实际元素。我认为代码是不言自明的:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import PathPatch

df = pd.DataFrame(np.random.rand(140, 4), columns=['A', 'B', 'C', 'D'])

df['models'] = pd.Series(np.repeat(['model1','model2', 'model3', 'model4',     'model5', 'model6', 'model7'], 20))

bp_dict = df.boxplot(
    by="models",layout=(4,1),figsize=(6,8),
    return_type='both',
    patch_artist = True,
)

colors = ['b', 'y', 'm', 'c', 'g', 'b', 'r', 'k', ]
for row_key, (ax,row) in bp_dict.iteritems():
    ax.set_xlabel('')
    for i,box in enumerate(row['boxes']):
        box.set_facecolor(colors[i])

plt.show()

结果图如下所示:

result of the above code

希望这对您有所帮助。

关于python - 更改 pandas boxplot 子图中各个框的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50963960/

相关文章:

python - 无法使用以下 python 代码保存文件。属性错误: 'Array' object has no attribute 'save'

python - 使用 dask 将数据帧划分保存到 parquet

python - 将 Pandas 列中的日期时间格式化为季度

python - 基于索引的跨 2 个数据帧的函数 (python)

python - 如何在无服务器 Lambda (Python) 中下载 S3 文件

python - 根据不同 Dataframe 中的多个条件删除 Dataframe 的行

python - 是否有通过对其他列进行一些计算来将列添加到数据集的最快方法?

python - 使用 groupby 后如何获取行子集的平均值?

python - Pandas - Groupby 或将多个数据帧剪切到垃圾箱

python - Pyspark 数据帧过滤器 OR 条件