子图中的熊猫盒图出现问题

我在子图中绘制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')

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

http://img2.mukewang.com/6059552e0001dd4d03280481.jpg

因此,我然后尝试手动提供轴:


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)

但这简单地破坏了子图网格以及原始图像:

http://img3.mukewang.com/605955460001bf9c03200253.jpg

有什么想法可以使我的箱线图图像显示在子图的右下角网格中(在第一组图像中为空)?


慕标5832272
浏览 165回答 1
1回答

牧羊人nacy

在熊猫绘图设置中,这似乎是一个错误,或者至少是不受欢迎的行为。发生的情况是,如果您为提供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,因此可以在正确的子图位置获得正确的图。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python