我有以下数据。
我正在使用滑块,以便我可以滑动不同的日期(请参见下图以了解滑块的情况)。 现在,由于我的类别可能会在日期之间发生变化,所以无论我的日期是什么,我都想用 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)
我希望我说得足够清楚。如果您需要任何额外信息,请告诉我。欢迎任何想法或建议:)
确保所有动画帧的所有类别都显示在 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])
...你会得到两个动画帧:
现在,让我们使用一种方法来确保所有日期都代表所有类别,正如您可以在帖子中找到的那样 Pandas:尽管长格式的数据框中缺少值,但如何包含所有行的所有列?
现在你会得到:
我希望这就是您正在寻找的。如果没有,请随时告诉我! 如果删除
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()