我在子图中绘制Pandas箱形图时遇到问题。基于我尝试的两种方式,创建箱线图要么删除我已经创建的所有子图,要么在子图网格之后绘制箱线图。但是我似乎无法在子图网格中绘制它。import matplotlib.pyplot as pltimport pandasfrom pandas import DataFrame, Seriesdata = {'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)但这简单地破坏了子图网格以及原始图像:有什么想法可以使我的箱线图图像显示在子图的右下角网格中(在第一组图像中为空)?
1 回答

牧羊人nacy
TA贡献1862条经验 获得超7个赞
在熊猫绘图设置中,这似乎是一个错误,或者至少是不受欢迎的行为。发生的情况是,如果您为提供by
参数boxplot
,pandas会发出自己的subplots
调用,从而删除所有现有的子图。显然,这样做是为了,如果要绘制多个值,它将为每个值创建子图(例如,一个框图用于Y1,每天,另一个用于Y2,等等)。
但是,看起来应该做但不应该做的是,检查是否仅绘制一个值,在这种情况下,请使用提供的ax
对象(如果有)而不是自己绘制子图。当您仅绘制一个值时,它会创建一个1乘1的子图网格,这并不是很有用。它的逻辑也有点奇怪,因为它根据要绘制的列数(第一个参数的长度)创建一个网格,但是只有在提供一个by
参数的情况下,它才会这样做。这样做的目的似乎是允许使用多盒图df.boxplot(['col1', 'col2'])
,但是这样做会妨碍您进行合理的尝试df.boxplot('col1', 'grouper1')
。
我建议在Pandas Bug Tracker上提出一个问题。
同时,一个有点棘手的解决方法是执行此操作:
df.pivot('val', 'day', 'val').boxplot(ax=ax)
这将重塑您的数据,以便分组依据值(天)为列。对于val
没有特定day
值出现的值,重塑后的表格具有许多NA ,但在绘制时会忽略这些NA,因此可以在正确的子图位置获得正确的图。
添加回答
举报
0/150
提交
取消