【问题标题】:Multiple boxplot in a single Graphic in PythonPython中单个图形中的多个箱线图
【发布时间】:2022-01-17 23:40:38
【问题描述】:

我是 Python 初学者。

在我的实习项目中,我试图从 csv 中包含的数据中绘制 bloxplots

我需要为上面显示的 4(四个)变量(AAG、DENS、SRG 和 RCG)中的每一个绘制 bloxplot。由于每个变量呈现的值都在[001]到[100]的范围内,所以每个变量会有100个箱线图,需要绘制在一个图中,如图所示。

这是我需要绘制的图表,但对于每个变量将有 100 个 bloxplots,因为每个变量都有 100 列值:

x 轴是“年”,范围从 2025 年到 2030 年,所以我需要一个类似于图 2 所示的图表,y 轴是每年的值集每个变量。

使用Pandas-melt 函数和seaborn 库,我只能绘制列的箱线图。但这不是我需要的:

import pandas as pd
import seaborn as sns
 
df = pd.read_csv("2DBM_50x50_Central_Aug21_Sim.cliped.csv")
mdf= df.melt(id_vars=['Year'], value_vars='AAG[001]')
print(mdf)
ax=sns.boxplot(x='Year', y='value',width = 0.2, data=mdf)

以上代码的结果:

我可以尝试什么来解决这个问题?

【问题讨论】:

  • 如何为 100 列单独绘制箱线图,并将 Year 设置为 x 轴?您的每一列都跨度从 2025 年到 2030 年。
  • This plot 是您从每个变量的前 24 列中得到的。在这个图中,AAG 变量的最左边的箱线图是TB_acc_AAG[00001],第二个是TB_acc_AAG[00002],依此类推。但 x 轴实际上并不是 Year,因为它只有六个值。
  • 在原始文件中,每个变量的所有 100 列数据都有每年的值(从 2025 到 3030),即按 2025 年过滤“期间”列时,我将有一个过滤数据集,指的是 2025 年,其他年份也是如此。
  • 每个按年份过滤的数据集将用于制作一个像这样的图表:(i.stack.imgur.com/X0hZM.png) [每个图表将有 5 个不同的图,每个变量一个图(AAG、DENS、SRG、RCG和厚)具有各自的 100 个箱线图,因为每个变量有 100 列]。该图的 x 轴是年份(过滤的年份),y 轴是指今年的数据。因此,我需要 6 个图表(每年一个)。
  • 感谢您的回复!

标签: python pandas matplotlib seaborn boxplot


【解决方案1】:

以下代码为您提供了五个子图,其中每个子图仅包含一个变量的数据。然后每年生成一个箱线图。要更改用于每个变量的列范围,请更改 var_range = range(1, 101) 中的上限,并查看异常值将 showfliers 更改为 True

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

df = pd.read_csv("2DBM_50x50_Central_Aug21_Sim.cliped.csv")

variables = ["AAG", "DENS", "SRG", "RCG", "Thick"]
period = range(2025, 2031)
var_range = range(1, 101)

fig, axes = plt.subplots(2, 3)
flattened_axes = fig.axes
flattened_axes[-1].set_visible(False)

for i, var in enumerate(variables):
    var_columns = [f"TB_acc_{var}[{j:05}]" for j in var_range]
    data = df.melt(id_vars=["Period"], value_vars=var_columns, value_name=var)
    ax = flattened_axes[i]
    sns.boxplot(x="Period", y=var, width=0.2, data=data, ax=ax, showfliers=False)

plt.tight_layout()
plt.show()

输出:

【讨论】:

  • 谢谢!关于我展示的图表,这只是我希望图表看起来像的一个例子。您绘制的图表很棒,但是当我尝试将 100 个箱线图插入图中时,即使我更改了箱线图的大小,它也不适合。所以我想知道是否有任何方法可以做到这一点,通过改变绘图的排列(不是并排绘制)也许可以增加绘图区域,以便箱形图适合。
  • stacking them vertically 或者甚至强迫他们使用share the same x-axis 怎么样?
  • 感谢您的帮助,但我又搞砸了,但我保证这将是最后一次。正确的做法是在一张图中绘制一个变量的所有 bloxplots(每年一个),也就是说,将有 5 个图(每个 Variable 一个),每个图将包含6 个箱线图(每个 Year 一个)。因此,x 轴将包含年份信息,y 轴将是由变量的 100 列的连接点生成的箱线图。很抱歉再次打扰您,您能帮帮我吗?
  • 这是一个不同的问题,我认为你最好为它打开一个新问题。此页面已变得拥挤不堪,无法让其他人关注。
  • @halfer 感谢您的建议。我会确保我会改进你指出的问题。我真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多