如何在绘图表达动画中指定分类x轴元素

问题描述 投票:0回答:1

我有以下数据。

我正在使用滑块,以便我可以滑动不同的日期(请参见下图以了解滑块的情况)。 现在,由于我的类别可能会在日期之间发生变化,所以无论我的日期是什么,我都想用 A、B、C、E、F 初始化我的 x 轴范围。所以有时我的类别中没有数据点,但这对我来说并不重要。

那么如何初始化我的x轴范围并使我的数据点适应初始化的x轴?

我正在使用 python3 和plotlyexpress。

这是我现在的代码:

data.columns = ['price', 'category', 'date']
    data = data.sort_values(by=['date', 'price'])
    fig = px.scatter(data, x = "category", y = "price", animation_frame="date")
    fig.update_layout(
        yaxis_title="Price (€)",
    )
    fig['layout']['updatemenus'][0]['pad']['t'] = 180
    fig['layout']['sliders'][0]['pad']['t'] = 200
    fig.write_html("/home/**/Desktop/1.html", auto_play=True)

我希望我说得足够清楚。如果您需要任何额外信息,请告诉我。欢迎任何想法或建议:)

python python-3.x plotly plotly-python
1个回答
3
投票

答案:

确保所有动画帧的所有类别都显示在 x 轴上的唯一方法是确保它们出现在第一个

Date = X
中。因此,您实际上无法修复图形本身中的 x 轴范围。您必须通过数据源的表示来完成此操作。

详情:

所以有时我的类别中没有数据点,但这对我来说并不重要。

也许不是,但它将会对plotly.express很重要。特别是如果您所说的“没有数据”意味着您的数据集中没有所有日期的所有类别的记录。您会看到,plotly 似乎将 x 轴值设置为它在

Date = X
的第一个唯一值(即
A, B ,C
)中找到的类别。但别担心,我们也会处理这个问题。让我们使用数据屏幕截图的稍微修改版本(下次,执行此操作)。我添加了实际日期而不是
X, Y
并稍微缩小了数字的范围,因为您的特定数据使动画有点混乱。

如果我们使用这样的动画方法:

fig = px.scatter(df1, x="Category", y="Price", animation_frame="Date",
                  color="Category", range_y=[0,20])

...你会得到两个动画帧:

图 1,帧 1

图 1,帧 2

现在,让我们使用一种方法来确保所有日期都代表所有类别,正如您可以在帖子中找到的那样 Pandas:尽管长格式的数据框中缺少值,但如何包含所有行的所有列?

现在你会得到:

图 2,第 1 帧

图 2,帧 2

我希望这就是您正在寻找的。如果没有,请随时告诉我! 如果删除

df1.fillna(0)
部分,您会得到略有不同的结果。但我会让你自行处理

中的所有可用选项

完整代码:

import pandas as pd
import plotly.express as px

df = pd.DataFrame({'Date': {0: '24.08.2020',
                              1: '24.08.2020',
                              2: '24.08.2020',
                              3: '25.08.2020',
                              4: '25.08.2020',
                              5: '25.08.2020'},
                             'Category': {0: 'A', 1: 'B', 2: 'C', 3: 'C', 4: 'E', 5: 'F'},
                             'Price': {0: 1, 1: 2, 2: 3, 3: 3, 4: 10, 5: 13}})

# make sure that all category variables are represented for
# all dates even though not all variables have values.
df['key']=df.groupby(['Date','Category']).cumcount()
df1 = pd.pivot_table(df,index='Date',columns=['key','Category'],values='Price')
df1 = df1.stack(level=[0,1],dropna=False).to_frame('Price').reset_index()
df1 = df1[df1.key.eq(0) | df1['Price'].notna()]
df1=df1.fillna(0)

# ploty express animation
fig = px.scatter(df1, x="Category", y="Price", animation_frame="Date",
                  color="Category", range_y=[0,20])

# some extra settings.
fig.update_layout(transition = {'duration': 20000})


fig.show()
© www.soinside.com 2019 - 2024. All rights reserved.