微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PlotnineError: 'Aesthetics 必须是长度为 1 或与数据相同的长度'

如何解决PlotnineError: 'Aesthetics 必须是长度为 1 或与数据相同的长度'

我正在尝试使用 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,0)
df['barLabel'] = ('100','-20','+10','+20','110')
df['labelPosition'] = ('105','75','95','115','115')
df['colour'] = ('grey','red','green','grey')

p = (ggplot(df,aes(x=np.arange(0,5,1),xend=np.arange(0,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))
)

enter image description here

但是,我的数据框看起来更像这样(即堆叠组):

df = pd.DataFrame({})
df['label'] = ('A','E','A','E')
df['percentile'] = (10,20)*5
df['value'] = (100,110)*2
df['yStart'] = (0,0)*2
df['barLabel'] = ('100','110')*2
df['labelPosition'] = ('105','115')*2
df['colour'] = ('grey','grey')*2

当我尝试时:

p = (ggplot(df,yend='value'))
    + theme_light(6)
    + geom_segment(size=10)
    + ylab('value')
    + facet_wrap('~percentile')
    + scale_y_continuous(breaks=np.arange(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,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 位置也会对齐然后您可以使用列名称并将其打印为轴标签。 plot with facets

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。