Pandas boxplot并排显示不同的DataFrame

Posted

技术标签:

【中文标题】Pandas boxplot并排显示不同的DataFrame【英文标题】:Pandas boxplot side by side for different DataFrame 【发布时间】:2018-09-21 08:02:39 【问题描述】:

尽管网上有关于并排绘制箱线图的很好的例子。通过将我的数据设置在两个不同的 pandas DataFrames 中并且已经有了总和子图的方式,我无法管理让我的箱线图彼此相邻而不是重叠。

我的代码如下:

import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
mpl.use('agg')

fig, axarr = plt.subplots(3,sharex=True,sharey=True,figsize=(9,6))
month = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec']
percentiles = [90,95,98]
nr = 0
for p in percentiles:  
    future_data = pd.DataFrame(np.random.randint(0,30,size=(30,12)),columns = month)
    present_data = pd.DataFrame(np.random.randint(0,30,size=(30,12)),columns = month)

    Future = future_data.as_matrix()
    Present = present_data.as_matrix()      

    pp = axarr[nr].boxplot(Present,patch_artist=True, showfliers=False)   
    fp = axarr[nr].boxplot(Future, patch_artist=True, showfliers=False)

    nr += 1           

结果如下: Overlapping Boxplots

你能帮我看看如何确保盒子彼此相邻,这样我就可以比较它们而不会被重叠所困扰?

谢谢!

编辑:我已经稍微减少了代码,所以它可以像这样运行。

【问题讨论】:

您能否提供一个最小的可运行示例?似乎有一半以上的代码与您在这里要问的问题无关。 嗨,我不太清楚你的意思。为了得到我想要的情节,我需要这个完整的代码。我已经删除了不必要的细节。如果我取出patch_artist 的东西,那么有人可能会想出一个不支持patch_artist 的解决方案。上次我拿出细节有人告诉我代码不完整,所以这里有一个完整的代码。我不想在这里偷懒,我只是真的需要一些帮助来解决这个特定问题。 我无法复制代码并运行它,可以吗?所以你需要想出一些代码,让人们可以帮助你,这些代码与你的真实代码足够相似,这样任何给定的解决方案都可以应用。在这种情况下,创建一些数据以在代码中使用,而不是加载文件。并摆脱任何不必要的样式(没人关心这些元素的颜色)。 啊,我明白了。谢谢,我已经添加了我的代码。现在它立即运行。希望你能帮忙:) 当您在同一轴上为两个 daraframe 绘制图形时,您会重叠。 【参考方案1】:

您需要手动定位条形,即将位置作为数组提供给 boxplot 的 position 参数。在这里,将一个移动 -0.2 和另一个移动 +0.2 到它们的整数位置是有意义的。然后,您可以调整它们的宽度,使其总和小于位置差异。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

fig, axarr = plt.subplots(3,sharex=True,sharey=True,figsize=(9,6))
month = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec']
percentiles = [90,95,98]
nr = 0
for p in percentiles:  
    future_data = pd.DataFrame(np.random.randint(0,30,size=(30,12)),columns = month)
    present_data = pd.DataFrame(np.random.randint(0,30,size=(30,12)),columns = month)

    Future = future_data.as_matrix()
    Present = present_data.as_matrix()      

    pp = axarr[nr].boxplot(Present,patch_artist=True, showfliers=False, 
                           positions=np.arange(Present.shape[1])-.2, widths=0.4)   
    fp = axarr[nr].boxplot(Future, patch_artist=True, showfliers=False,
                           positions=np.arange(Present.shape[1])+.2, widths=0.4)

    nr += 1  

axarr[-1].set_xticks(np.arange(len(month)))
axarr[-1].set_xticklabels(month)
axarr[-1].set_xlim(-0.5,len(month)-.5)

plt.show()

【讨论】:

谢谢!这正是我想要的。

以上是关于Pandas boxplot并排显示不同的DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

R语言R原生及可视化包ggplot2绘制并排的箱图实战(Side-by-Side Boxplots)

pandas DataFrame 多列的并排箱线图

并排输出两个Pandas数据帧的差异 - 突出显示差异

pandas 生成并排放置的条形图和箱线图

pandas使用set_table_attributes函数display_html函数等在jupyter notebook中并排显示两个dataframe的内容(side by side)

突出显示 plotly.js boxplot 中的一个值