我在子图中绘制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)
我尝试的第一件事是:
plt.figure()
plt.subplot(2, 2, 1)
plt.plot([1, 2, 3])
plt.subplot(2, 2, 4)
df.boxplot('val', 'day')
但这只是在子图之外创建了情节:
所以,我接着尝试手工提供轴:
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)
但这只是将子图网格一起摧毁,以及初始图像:
任何想法如何让我的boxplot图像显示在子图中右下角的网格中(第一组图像中为空的那个)?
答案 0 :(得分:5)
在熊猫绘图设置中,这似乎是一个错误,或者至少是不良行为。发生的事情是,如果你向by
提供boxplot
参数,pandas会发出自己的subplots
调用,删除任何现有的子图。它显然是这样做的,因此,如果你想绘制多个值,它将为每个值创建子图(例如,Y1的一个箱图,白天的Y2,等等。)
然而,看起来它应该做什么,但它没有,检查你是否只绘制一个值,在这种情况下,使用提供的ax
对象(如果有的话)而不是制作自己的子图。当您只绘制一个值时,它会创建一个1乘1的子图网格,这不是很有用。它的逻辑也有点奇怪,因为它根据你正在绘制的列的数量创建一个网格(第一个参数的长度),但它只在你提供{{{ 1}}参数。目的似乎是允许像by
这样的多框图,但这样做会妨碍你做df.boxplot(['col1', 'col2'])
的合理尝试。
我建议在大熊猫bug tracker上提出一个问题。
与此同时,一个有点hackish的解决方法是这样做:
df.boxplot('col1', 'grouper1')
这会重塑您的数据,以便分组值(天数)为列。重新整形的表具有许多df.pivot('val', 'day', 'val').boxplot(ax=ax)
值的NA,这些值不会出现特定的val
值,但在绘图时会忽略这些NA,因此您可以在右侧的子图位置获得正确的图。 / p>