python - 更改熊猫箱线图子图中各个框的颜色
问题描述
这是参考以下问题,其中讨论了调整子图标题和布局的选项: 修改熊猫箱线图输出
我的要求是更改每个子图中各个框的颜色(如下所示):
以下是共享链接中用于调整子图的标题和轴属性的代码:
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('color') 属性,但没有成功获得所需的结果。
我也尝试访问 bp['boxes'] 但显然它不可用。我需要对存储在 bp 中的数据结构有所了解,才能访问子图中的各个框。
期待
PS:我知道seaborn。但目前需要使用 df.boxplot 来理解和实现。谢谢
解决方案
要调整 中框的颜色pandas.boxplot
,您必须稍微调整代码。首先,您必须告诉boxplot
实际用颜色填充框。您可以通过指定 来执行此操作patch_artist = True
,如此处所述。但是,您似乎无法指定颜色(默认为蓝色) - 如果我错了,请任何人纠正我。这意味着您必须在之后更改颜色。幸运的是pandas.boxplot
,提供了一个简单的选项,通过指定return_type = 'both'
请参阅此处获取解释,将箱线图中的艺术家作为返回值。你得到的是一个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()
结果图如下所示:
希望这可以帮助。
推荐阅读
- css - 对于带边框的内部 DIV,如何滚动 DIV 的内容,但保持边框固定?
- sql - 绑定动态查询以填充 GridView 或类似的 asp.net webforms 控件以在网页中显示结果
- azure - Azure Metrics Graphs 根据样式显示不同的结果
- java - 来自同一主机上的应用程序的请求导致问题?
- javascript - 如何查看表示应用悬停的条的当前元素
- reactjs - 每小时刷新令牌的最佳方法?
- python - 使用交叉验证(scikit-learn)时获取单个数据点的错误
- vue.js - 如何根据两个数组的比较进行过滤?
- perl - 如何在 Getopt::Long getoptions 中打印命令参数
- python - AttributeError:类型对象“pandana.cyaccess.cyaccess”没有属性“__reduce_cython__”