使用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处理时出现维度不匹配的冲突。
修正代码
- 修正
pd.melt的var_name参数,使用不重复的名称(比如'Metric')来区分均值和标准差这两个指标:
df1_melted = pd.melt(df1, id_vars=['SampleSize'], var_name='Metric', value_name='Value')
- 调整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
相关产品推荐
相关产品推荐

