小能豆

ValueError: Wrong number of items passed 2, placement implies 1 when graphing a facet_grid with plotnine

python

我用 Pandas 构建了以下数据框:

    SampleSize      Mean  StandardDeviation
0            5  0.134151           0.739142
1           25 -0.111257           1.154803
2           45 -0.049999           0.918167
3           65 -0.162783           1.179178
4           85 -0.097452           0.966980
5          105 -0.050559           1.161751
6          125 -0.038383           1.018117
7          145  0.086192           1.028177
8          165  0.045295           1.090246
9          185 -0.107837           1.101610
10         205  0.088160           0.967483
...
40         805  0.020641           1.007389
41         825  0.022781           0.991498
42         845 -0.027429           0.962288
43         865 -0.105373           1.007109
44         885 -0.054397           1.015499
45         905 -0.023729           0.989168
46         925  0.025044           0.989950
47         945  0.021345           1.035740
48         965  0.023404           0.963122
49         985  0.020648           1.000148

总共 50 个随机正态样本的大小、均值和标准差。我正在尝试绘制一个facet_grid,显示与样本大小并排比较的平均值和标准差。

我当前使用的代码是:

df1 = pd.DataFrame({'SampleSize': range(5, SAMPLE_SIZE, 20), 'Mean': means, 'StandardDeviation': stdev})

df1_melted = pd.melt(df1, id_vars=['SampleSize'], var_name='SampleSize', value_name='Value')

ggplot(df1_melted, aes(x='SampleSize', y='Value', color='SampleSize')) + \
    geom_line() + \
    geom_point() + \
    facet_grid('SampleSize ~ .') + \
    labs(x='SampleSize', y='Mean and StandardDeviation')

这导致:

...
/usr/lib/python3.7/site-packages/pandas/core/internals/blocks.py in new_block(values, placement, ndim, klass)
   1935 
   1936     values, _ = extract_pandas_array(values, None, ndim)
-> 1937     check_ndim(values, placement, ndim)
   1938 
   1939     if klass is None:

/usr/lib/python3.7/site-packages/pandas/core/internals/blocks.py in check_ndim(values, placement, ndim)
   1978         if len(placement) != len(values):
   1979             raise ValueError(
-> 1980                 f"Wrong number of items passed {len(values)}, "
   1981                 f"placement implies {len(placement)}"
   1982             )

ValueError: Wrong number of items passed 2, placement implies 1

我对哪里出了问题感到困惑,因为当我分别绘制两张图时它起作用了。


阅读 122

收藏
2023-10-09

共1个答案

小能豆

在你的代码中,你试图在一个 facet_grid 中同时显示两个变量(”Mean” 和 “StandardDeviation”),这可能导致出现错误。facet_grid 通常用于将一个变量的不同水平按行或列分组显示。如果你想同时显示均值和标准差,可以考虑创建两个不同的 facet_grid,或者使用其他方式来可视化这两个变量。

下面是一种可能的解决方案,将均值和标准差分别绘制在两个 facet_grid 中:

import pandas as pd
from plotnine import *

# 你的数据框
data = {
    'SampleSize': list(range(5, 1000, 20)),
    'Mean': [0.134151, -0.111257, -0.049999, -0.162783, -0.097452, -0.050559, -0.038383, 0.086192, 0.045295, -0.107837, 0.088160],
    'StandardDeviation': [0.739142, 1.154803, 0.918167, 1.179178, 0.966980, 1.161751, 1.018117, 1.028177, 1.090246, 1.101610, 0.967483]
}

df = pd.DataFrame(data)

# 绘制均值的 facet_grid
p1 = (ggplot(df, aes(x='SampleSize', y='Mean')) +
      geom_line() +
      geom_point() +
      labs(x='SampleSize', y='Mean') +
      facet_grid('~ .'))

# 绘制标准差的 facet_grid
p2 = (ggplot(df, aes(x='SampleSize', y='StandardDeviation')) +
      geom_line() +
      geom_point() +
      labs(x='SampleSize', y='StandardDeviation') +
      facet_grid('~ .'))

# 显示两个图表
print(p1)
print(p2)

这段代码将均值和标准差分别绘制在两个 facet_grid 中,让你可以分开比较它们。希望这可以帮助你解决问题!

2023-10-09