PlotnineError: 'Aesthetics must either be length one, or the same length as the data'
PlotnineError: 'Aesthetics must either be length one, or the same length as the data'
我正在尝试使用 plotnine 构建瀑布图。有 9 个分组 (percentiles
),所以我想要一个 3x3 facet_wrap
图。
下面是一些样本数据,以及我希望基于 9 个分组中的 1 个分组的情节。我在尝试添加更多类别和 facet_wrap
.
时遇到错误
1 个分组的代码和我正在尝试做的事情的说明:
df = pd.DataFrame({})
df['label'] = ('A','B','C','D','E')
df['percentile'] = (10)*5
df['value'] = (100,80,90,110,110)
df['yStart'] = (0,100,80,90,0)
df['barLabel'] = ('100','-20','+10','+20','110')
df['labelPosition'] = ('105','75','95','115','115')
df['colour'] = ('grey','red','green','green','grey')
p = (ggplot(df, aes(x=np.arange(0,5,1), xend=np.arange(0,5,1), y='yStart',yend='value',fill='colour'))
+ theme_light(6)
+ geom_segment(size=10)
+ ylab('value')
+ scale_y_continuous(breaks=np.arange(0,141,20), limits=[0,140], expand=(0,0))
)
但是,我的数据框看起来更像这样(即堆叠组):
df = pd.DataFrame({})
df['label'] = ('A','B','C','D','E','A','B','C','D','E')
df['percentile'] = (10,20)*5
df['value'] = (100,80,90,110,110)*2
df['yStart'] = (0,100,80,90,0)*2
df['barLabel'] = ('100','-20','+10','+20','110')*2
df['labelPosition'] = ('105','75','95','115','115')*2
df['colour'] = ('grey','red','green','green','grey')*2
当我尝试时:
p = (ggplot(df, aes(x=np.arange(0,5,1), xend=np.arange(0,5,1), y='yStart',yend='value'))
+ theme_light(6)
+ geom_segment(size=10)
+ ylab('value')
+ facet_wrap('~percentile')
+ scale_y_continuous(breaks=np.arange(0,141,20), limits=[0,140], expand=(0,0))
)
我收到以下错误:
PlotnineError: 'Aesthetics must either be length one, or the same length as the data'
错误是因为您传递给 x 和 x_end 美学的数据只有 5 个观察值,但第二次尝试中的其余数据有 10 个观察值(每个所需的方面 5 个)。为了克服这个问题,您需要提供具有一个观察值的数据(它将为所有数据观察值复制)或与输入 DataFrame 一样多的观察值(10 个观察值),如下所示。
x_dat = [i for i in np.arange(0,5,1)]*2 # [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
p = (ggplot(df, aes(x=x_dat, xend=x_dat, y='yStart',yend='value'))
+ theme_light(6)
+ geom_segment(size=10)
+ ylab('value')
+ facet_wrap('~percentile')
+ scale_y_continuous(breaks=np.arange(0,141,20), limits=[0,140], expand=(0,0))
)
p
将此数据作为列添加到 DataFrame 更安全,这样即使行的顺序不符合您的要求,x 位置也会对齐然后您可以使用列名并将其打印为轴标签。
我正在尝试使用 plotnine 构建瀑布图。有 9 个分组 (percentiles
),所以我想要一个 3x3 facet_wrap
图。
下面是一些样本数据,以及我希望基于 9 个分组中的 1 个分组的情节。我在尝试添加更多类别和 facet_wrap
.
1 个分组的代码和我正在尝试做的事情的说明:
df = pd.DataFrame({})
df['label'] = ('A','B','C','D','E')
df['percentile'] = (10)*5
df['value'] = (100,80,90,110,110)
df['yStart'] = (0,100,80,90,0)
df['barLabel'] = ('100','-20','+10','+20','110')
df['labelPosition'] = ('105','75','95','115','115')
df['colour'] = ('grey','red','green','green','grey')
p = (ggplot(df, aes(x=np.arange(0,5,1), xend=np.arange(0,5,1), y='yStart',yend='value',fill='colour'))
+ theme_light(6)
+ geom_segment(size=10)
+ ylab('value')
+ scale_y_continuous(breaks=np.arange(0,141,20), limits=[0,140], expand=(0,0))
)
但是,我的数据框看起来更像这样(即堆叠组):
df = pd.DataFrame({})
df['label'] = ('A','B','C','D','E','A','B','C','D','E')
df['percentile'] = (10,20)*5
df['value'] = (100,80,90,110,110)*2
df['yStart'] = (0,100,80,90,0)*2
df['barLabel'] = ('100','-20','+10','+20','110')*2
df['labelPosition'] = ('105','75','95','115','115')*2
df['colour'] = ('grey','red','green','green','grey')*2
当我尝试时:
p = (ggplot(df, aes(x=np.arange(0,5,1), xend=np.arange(0,5,1), y='yStart',yend='value'))
+ theme_light(6)
+ geom_segment(size=10)
+ ylab('value')
+ facet_wrap('~percentile')
+ scale_y_continuous(breaks=np.arange(0,141,20), limits=[0,140], expand=(0,0))
)
我收到以下错误:
PlotnineError: 'Aesthetics must either be length one, or the same length as the data'
错误是因为您传递给 x 和 x_end 美学的数据只有 5 个观察值,但第二次尝试中的其余数据有 10 个观察值(每个所需的方面 5 个)。为了克服这个问题,您需要提供具有一个观察值的数据(它将为所有数据观察值复制)或与输入 DataFrame 一样多的观察值(10 个观察值),如下所示。
x_dat = [i for i in np.arange(0,5,1)]*2 # [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
p = (ggplot(df, aes(x=x_dat, xend=x_dat, y='yStart',yend='value'))
+ theme_light(6)
+ geom_segment(size=10)
+ ylab('value')
+ facet_wrap('~percentile')
+ scale_y_continuous(breaks=np.arange(0,141,20), limits=[0,140], expand=(0,0))
)
p
将此数据作为列添加到 DataFrame 更安全,这样即使行的顺序不符合您的要求,x 位置也会对齐然后您可以使用列名并将其打印为轴标签。