【问题标题】:PlotnineError: 'Aesthetics must either be length one, or the same length as the data'PlotnineError:'美学长度必须为一,或与数据长度相同'
【发布时间】:2021-02-11 13:48:48
【问题描述】:

我正在尝试使用 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'

【问题讨论】:

    标签: python python-3.x plotnine


    【解决方案1】:

    错误是因为您传递给 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 位置也会对齐然后您可以使用列名并将其打印为轴标签。

    【讨论】:

    • 哦,太好了,谢谢!我认为 facet_wrap 有效地对数据框进行了分区,因此每个图只需要 5 列,并且不明白错误在说什么。感谢您的帮助!
    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    相关资源
    最近更新 更多