在子图中出现Pandas boxplot

Geo*_*wis 5 python pandas

我在子图中绘制Pandas箱图时遇到问题.基于我正在尝试的两种方式,创建箱图可以删除我已创建的所有子图,也可以在子图网格后绘制箱图.但我似乎无法在子图网格中绘制它.

import matplotlib.pyplot as plt
import pandas
from pandas import DataFrame, Series

data = {'day' : Series([1, 1, 1, 2, 2, 2, 3, 3, 3]), 
        'val' : Series([3, 4, 5, 6, 7, 8, 9, 10, 11])}
df = pandas.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)

我尝试的第一件事是:

plt.figure()

plt.subplot(2, 2, 1)
plt.plot([1, 2, 3])

plt.subplot(2, 2, 4)
df.boxplot('val', 'day')
Run Code Online (Sandbox Code Playgroud)

但这只是创建了子图之外的情节:

尝试A. 在此输入图像描述

所以,我接着尝试手工提供轴:

plt.figure()

plt.subplot(2, 2, 1)
plt.plot([1, 2, 3])

plt.subplot(2, 2, 4)
ax = plt.gca()
df.boxplot('val', 'day', ax=ax)
Run Code Online (Sandbox Code Playgroud)

但这只是简单地破坏了子图网格,以及初始图像:

在此输入图像描述

任何想法如何让我的boxplot图像出现在子图中右下角的网格中(第一组图像中的空白)?

Bre*_*arn 6

在熊猫绘图设置中,这似乎是一个错误,或者至少是不良行为.发生的事情是,如果你提供一个by参数boxplot,pandas发出自己的subplots调用,删除任何现有的子图.它显然是这样做的,因此,如果你想绘制多个值,它将为每个值创建子图(例如,Y1的一个箱图按天,另一个为Y2,等等).

但是,看起来它应该做什么,但它没有,检查你是否只绘制一个值,在这种情况下,使用提供的ax对象(如果有的话)而不是制作自己的子图.当您只绘制一个值时,它会创建一个1乘1的子图网格,这不是很有用.它的逻辑也有点奇怪,因为它根据您绘制的数(第一个参数的长度)创建一个网格,但只有在您提供by参数时才会这样做.意图似乎是允许多箱情节df.boxplot(['col1', 'col2']),但这样做会阻止你的合理尝试df.boxplot('col1', 'grouper1').

我建议在pandas bug跟踪器上提出一个问题.

与此同时,一个有点hackish的解决方法是这样做:

df.pivot('val', 'day', 'val').boxplot(ax=ax)
Run Code Online (Sandbox Code Playgroud)

这会重塑您的数据,以便分组值(天数)为列.重新形成的表具有许多val不具有特定day值的值的NA,但在绘图时会忽略这些NA,因此您可以在右侧子图位置获得正确的图.