在pandas中更改箱线图的面颜色

8

我需要更改使用pandas实用程序函数绘制的盒形图的颜色。我可以使用color参数更改大多数属性,但无法弄清楚如何更改箱子的facecolor。 有人知道该怎么做吗?

import pandas as pd
import numpy as np
data = np.random.randn(100, 4)
labels = list("ABCD")
df = pd.DataFrame(data, columns=labels)
props = dict(boxes="DarkGreen", whiskers="DarkOrange", medians="DarkBlue", caps="Gray")
df.plot.box(color=props)
3个回答

15

虽然我仍然建议在绘制图表时使用seaborn和原始的matplotlib而不是使用pandas中的绘图界面,但事实证明你可以将patch_artist=True作为关键字参数传递给df.plot.box函数,这将使其传递给df.plot函数,进而传递给matplotlib.Axes.boxplot函数。

import pandas as pd
import numpy as np
data = np.random.randn(100, 4)
labels = list("ABCD")
df = pd.DataFrame(data, columns=labels)
props = dict(boxes="DarkGreen", whiskers="DarkOrange", medians="DarkBlue", caps="Gray")
df.plot.box(color=props, patch_artist=True)

输入图像描述


2

如建议所示,我最终创建了一个函数来绘制此图,使用了原始的matplotlib

def plot_boxplot(data, ax):
    bp = ax.boxplot(data.values, patch_artist=True)

    for box in bp['boxes']:
        box.set(color='DarkGreen')
        box.set(facecolor='DarkGreen')

    for whisker in bp['whiskers']:
        whisker.set(color="DarkOrange")

    for cap in bp['caps']:
        cap.set(color="Gray")

    for median in bp['medians']:
        median.set(color="white")

    ax.axhline(0, color="DarkBlue", linestyle=":")

    ax.set_xticklabels(data.columns)

2
我建议使用df.plot.box,并将patch_artist=Truereturn_type='both'一起使用(这将返回绘制箱形图的matplotlib轴和字典,其值是箱形图的matplotlib线),以获得最佳的自定义可能性。
例如,给定以下数据:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(
    data=np.random.randn(100, 4), 
    columns=list("ABCD")
)

您可以为所有的框设置特定的颜色:
fig,ax = plt.subplots(figsize=(9,6)) 
ax,props = df.plot.box(patch_artist=True, return_type='both', ax=ax)
for patch in props['boxes']:
    patch.set_facecolor('lime')
plt.show()

在此输入图片描述

你可以为每个方框设置特定的颜色:

colors = ['green','blue','yellow','red']

fig,ax = plt.subplots(figsize=(9,6)) 
ax,props = df.plot.box(patch_artist=True, return_type='both', ax=ax)
for patch,color in zip(props['boxes'],colors):
    patch.set_facecolor(color)
plt.show()

图片描述在这里输入

您可以轻松地集成一个颜色映射

colors = np.random.randint(0,10, 4)
cm = plt.cm.get_cmap('rainbow')
colors_cm = [cm((c-colors.min())/(colors.max()-colors.min())) for c in colors]

fig,ax = plt.subplots(figsize=(9,6)) 
ax,props = df.plot.box(patch_artist=True, return_type='both', ax=ax)
for patch,color in zip(props['boxes'],colors_cm):
    patch.set_facecolor(color)
# to add colorbar
fig.colorbar(plt.cm.ScalarMappable(
    plt.cm.colors.Normalize(min(colors),max(colors)), 
    cmap='rainbow'
), ax=ax, cmap='rainbow')
plt.show()

enter image description here


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