You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用plotnine绘制facet_grid时触发ValueError错误的问题求助

问题:使用plotnine绘制分面图时触发ValueError错误

数据背景

通过Pandas构建了包含50组正态样本的DataFrame,字段包括SampleSize(样本量)、Mean(均值)和StandardDeviation(标准差),数据示例如下:

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

当前代码

尝试用plotnine的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

问题分析与解决方案

问题原因

核心错误在于pd.melt操作时,将var_name设置为'SampleSize',与原DataFrame中作为id_vars的SampleSize列名重复,导致生成的df1_melted中存在两列同名的SampleSize,后续pandas和plotnine处理时出现维度不匹配的冲突。

修正代码

  1. 修正pd.melt的var_name参数,使用不重复的名称(比如'Metric')来区分均值和标准差这两个指标:
df1_melted = pd.melt(df1, id_vars=['SampleSize'], var_name='Metric', value_name='Value')
  1. 调整ggplot的参数,将颜色映射和分面依据改为新的Metric列:
ggplot(df1_melted, aes(x='SampleSize', y='Value', color='Metric')) + \
    geom_line() + \
    geom_point() + \
    facet_grid('Metric ~ .') + \
    labs(x='样本量', y='数值', title='样本量与均值、标准差的关系')

这样就能正常生成分面图,分别展示样本量与均值、样本量与标准差的关系。

内容的提问来源于stack exchange,提问作者Nikshith Konnuru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:59:53