我在子图中绘制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)
但这只是创建了子图之外的情节:

所以,我接着尝试手工提供轴:
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图像出现在子图中右下角的网格中(第一组图像中的空白)?
在熊猫绘图设置中,这似乎是一个错误,或者至少是不良行为.发生的事情是,如果你提供一个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,因此您可以在右侧子图位置获得正确的图.
| 归档时间: |
|
| 查看次数: |
3240 次 |
| 最近记录: |