Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Plotly:如何在Plotly express动画中指定分类x轴元素?_Python_Python 3.x_Plotly_Plotly Python - Fatal编程技术网

Python Plotly:如何在Plotly express动画中指定分类x轴元素?

Python Plotly:如何在Plotly express动画中指定分类x轴元素?,python,python-3.x,plotly,plotly-python,Python,Python 3.x,Plotly,Plotly Python,我有以下数据 我使用的是一个滑块,这样我就可以在不同的日期之间滑动(请看下面的图片,看看在这种情况下滑块是什么)。 现在,由于我的类别可能会在日期之间发生变化,我想用A、B、C、E、F来初始化我的x轴范围,无论我的日期是什么。所以有时候我在一个类别中没有数据点,但这对我来说并不重要 那么,如何初始化我的x轴范围并使我的数据点适应初始化的x轴 我正在使用python3和plotly express 这是我目前的代码: data.columns = ['price', 'category', 'd

我有以下数据

我使用的是一个滑块,这样我就可以在不同的日期之间滑动(请看下面的图片,看看在这种情况下滑块是什么)。 现在,由于我的类别可能会在日期之间发生变化,我想用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)
我希望我足够清楚。如果你需要任何额外的信息,请告诉我。欢迎提供任何想法或提示:)

答案: 确保所有动画帧的所有类别都显示在x轴上的唯一方法是确保它们出现在第一个
Date=x
中。因此,实际上无法在图形本身中固定x轴范围。您必须通过数据源的表示来实现这一点

详情如下: 所以有时候我在一个类别中没有数据点,但这对我来说并不重要

也许不是,但这会影响到你的表达。特别是如果您所说的“无数据”意味着您的数据集中没有所有日期的所有类别的记录。您可以看到,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帧

现在,让我们使用一种方法来确保所有日期的所有类别都表示为您可以在帖子中找到的

现在您将获得:

地块2,第1帧

情节2,第2帧

我希望这就是你想要的。如果没有,请毫不犹豫地告诉我! 如果删除
df1.fillna(0)
部分,您将得到稍微不同的结果。但是我会让你来搞乱这个世界上所有可用的选项

完整代码:
也许这对其他人来说是100%清楚的,但我个人不太明白你想在这里实现什么。您想在x轴上显示
A、B、C、F
?动画的每一步都保持不变?如果是这样的话,那么提供的屏幕截图不会给解释增加太多内容,因为x轴值是日期?您是否可以使用所描述的方法提供数据集的样本?您是否希望x轴上有a、B、C、F?动画的每一步都保持不变?是的,这就是我的目的。我的建议对你有什么帮助?
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()