【问题标题】:Plotly: How to specify categorical x-axis elements in a plotly express animation?Plotly:如何在 plotly express 动画中指定分类 x 轴元素?
【发布时间】:2020-08-22 07:45:51
【问题描述】:

我有以下数据。

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

那么如何初始化我的x轴范围,让我的数据点适应初始化后的x轴呢?

我正在使用 python3 和 plotly express。

这是我现在的代码:

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)

我希望我已经足够清楚了。如果您需要任何额外信息,请告诉我。欢迎任何想法或提示:)

【问题讨论】:

  • 也许这对其他人来说是 100% 清楚的,但我不太明白你想在这里实现什么。你想A, B, C ,F 在你的 x 轴上吗?并且动画的每一步都保持不变?如果是这种情况,那么提供的屏幕截图并没有增加太多解释,因为 x 轴值是日期?您能否使用here 描述的方法提供数据集样本?
  • 您想要在 x 轴上使用 A、B、C、F 吗?并且动画的每一步都保持不变?是的,这是我的目的*
  • 我的建议对你有什么效果?

标签: python python-3.x plotly plotly-python


【解决方案1】:

答案:

确保所有动画帧的所有类别都显示在 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: How to include all columns for all rows although value is missing in a dataframe with a long format? 中找到的那样

现在你会得到:

情节 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()

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 2020-11-01
    • 2019-04-02
    • 2021-10-21
    • 2020-12-15
    • 2021-03-10
    • 2021-10-27
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多