Python Plotly:如何使用Plotly express自定义xaxis刻度标签?

Python Plotly:如何使用Plotly express自定义xaxis刻度标签?,python,plotly,Python,Plotly,我试图显示一个在x轴上有日期的水平条形图,但似乎无法做到这一点,尽管x值是字符串类型的日期。正如您在下面所看到的,作为标签出现的数字必须是某种类型的总和,但我不确定确切是什么。如何更改下面的示例以获取日期标签 绘图1: # imports import numpy as np import pandas as pd import plotly.express as px from datetime import datetime # data np.random.seed(1) cols=li

我试图显示一个在x轴上有日期的水平条形图,但似乎无法做到这一点,尽管x值是字符串类型的日期。正如您在下面所看到的,作为标签出现的数字必须是某种类型的总和,但我不确定确切是什么。如何更改下面的示例以获取日期标签

绘图1:

# imports
import numpy as np
import pandas as pd
import plotly.express as px
from datetime import datetime

# data
np.random.seed(1)
cols=list('ABCDE')
df = pd.DataFrame(np.random.randint(0,2,size=(5, len(cols))), columns=cols)
drng=pd.date_range(datetime(2020, 1, 1).strftime('%Y-%m-%d'), periods=df.shape[0]).tolist()
df['date']=[d.strftime('%Y-%m-%d') for d in drng]
dfm=pd.melt(df, id_vars=['date'], value_vars=df.columns[:-1])

# plotly express
fig = px.bar(dfm, x="date", y="variable", color='value', orientation='h',
             hover_data=["date"],
             height=400,
             color_continuous_scale=['blue', 'teal'],
             title='Custom date ticklabels for vertical bar plot',
             template='plotly_white',
            )

fig.update_traces(showlegend=False)
fig.update(layout_coloraxis_showscale=False)
fig.show()

代码:

# imports
import numpy as np
import pandas as pd
import plotly.express as px
from datetime import datetime

# data
np.random.seed(1)
cols=list('ABCDE')
df = pd.DataFrame(np.random.randint(0,2,size=(5, len(cols))), columns=cols)
drng=pd.date_range(datetime(2020, 1, 1).strftime('%Y-%m-%d'), periods=df.shape[0]).tolist()
df['date']=[d.strftime('%Y-%m-%d') for d in drng]
dfm=pd.melt(df, id_vars=['date'], value_vars=df.columns[:-1])

# plotly express
fig = px.bar(dfm, x="date", y="variable", color='value', orientation='h',
             hover_data=["date"],
             height=400,
             color_continuous_scale=['blue', 'teal'],
             title='Custom date ticklabels for vertical bar plot',
             template='plotly_white',
            )

fig.update_traces(showlegend=False)
fig.update(layout_coloraxis_showscale=False)
fig.show()
我所尝试的:

# imports
import numpy as np
import pandas as pd
import plotly.express as px
from datetime import datetime

# data
np.random.seed(1)
cols=list('ABCDE')
df = pd.DataFrame(np.random.randint(0,2,size=(5, len(cols))), columns=cols)
drng=pd.date_range(datetime(2020, 1, 1).strftime('%Y-%m-%d'), periods=df.shape[0]).tolist()
df['date']=[d.strftime('%Y-%m-%d') for d in drng]
dfm=pd.melt(df, id_vars=['date'], value_vars=df.columns[:-1])

# plotly express
fig = px.bar(dfm, x="date", y="variable", color='value', orientation='h',
             hover_data=["date"],
             height=400,
             color_continuous_scale=['blue', 'teal'],
             title='Custom date ticklabels for vertical bar plot',
             template='plotly_white',
            )

fig.update_traces(showlegend=False)
fig.update(layout_coloraxis_showscale=False)
fig.show()
对于
xaxis=dict()
中的
fig.update_layout
,我尝试了
tickmode
tickvals
ticktext
的不同组合,结果完全没有用

尝试2:
勾选文本

fig.update_layout(yaxis=dict(title=''),
                  xaxis=dict(title='',
                  gridcolor='grey',
                  #tickmode= 'array',
                  #tickmode= 'linear',
                  tick0= 2050,
                  #dtick=2,
                  tickvals= [2050, 2100, 2150, 2200],
                  ticktext = df['date'])
                 )
设置
tickvals=df['date']

fig.update_layout(yaxis=dict(title=''),
                  xaxis=dict(title='',
                  gridcolor='grey',
                  #tickmode= 'array',
                  #tickmode= 'linear',
                  #tick0= 2220,
                  #dtick=200,
                  #tickvals= [2020, 2040],
                  ticktext = df['date'])
                 )
绘图2:

同上:

尝试3:
勾选文本
&
d勾选

令我惊讶的是,将
dtick
设置为任意值可以得到下面的图

fig.update_layout(yaxis=dict(title=''),
                  xaxis=dict(title='',
                  gridcolor='grey',
                  #tickmode= 'array',
                  #tickmode= 'linear',
                  tick0= 2050,
                  dtick=2,
                  #tickvals= [2020, 2040],
                  ticktext = df['date'])
                 )
绘图3:

# imports
import numpy as np
import pandas as pd
import plotly.express as px
from datetime import datetime

# data
np.random.seed(1)
cols=list('ABCDE')
df = pd.DataFrame(np.random.randint(0,2,size=(5, len(cols))), columns=cols)
drng=pd.date_range(datetime(2020, 1, 1).strftime('%Y-%m-%d'), periods=df.shape[0]).tolist()
df['date']=[d.strftime('%Y-%m-%d') for d in drng]
dfm=pd.melt(df, id_vars=['date'], value_vars=df.columns[:-1])

# plotly express
fig = px.bar(dfm, x="date", y="variable", color='value', orientation='h',
             hover_data=["date"],
             height=400,
             color_continuous_scale=['blue', 'teal'],
             title='Custom date ticklabels for vertical bar plot',
             template='plotly_white',
            )

fig.update_traces(showlegend=False)
fig.update(layout_coloraxis_showscale=False)
fig.show()

仍然毫无用处,但现在的刻度至少看起来像日期,尽管我们正在查看一个值,该值表示
2008
中的时间戳,源数据是
2020

尝试4:
滴答声
滴答声文本

fig.update_layout(yaxis=dict(title=''),
                  xaxis=dict(title='',
                  gridcolor='grey',
                  #tickmode= 'array',
                  #tickmode= 'linear',
                  tick0= 2050,
                  #dtick=2,
                  tickvals= [2050, 2100, 2150, 2200],
                  ticktext = df['date'])
                 )
绘图4:

# imports
import numpy as np
import pandas as pd
import plotly.express as px
from datetime import datetime

# data
np.random.seed(1)
cols=list('ABCDE')
df = pd.DataFrame(np.random.randint(0,2,size=(5, len(cols))), columns=cols)
drng=pd.date_range(datetime(2020, 1, 1).strftime('%Y-%m-%d'), periods=df.shape[0]).tolist()
df['date']=[d.strftime('%Y-%m-%d') for d in drng]
dfm=pd.melt(df, id_vars=['date'], value_vars=df.columns[:-1])

# plotly express
fig = px.bar(dfm, x="date", y="variable", color='value', orientation='h',
             hover_data=["date"],
             height=400,
             color_continuous_scale=['blue', 'teal'],
             title='Custom date ticklabels for vertical bar plot',
             template='plotly_white',
            )

fig.update_traces(showlegend=False)
fig.update(layout_coloraxis_showscale=False)
fig.show()
从if的外观来看,这正是我想要的:

但这和其他尝试一样没有用,因为我们必须指定
tickvals=[2050210021502200]
。如果我们改变周期,这些值必须重新指定,这不是很灵活。当然,如果我们能够以某种方式检索plotly使用的默认值,我们可以轻松地用数据集中的日期替换它们。但根据邮报的回答,这似乎仍然是不可能的


我在这里完全不知所措,并且被我的尝试的无用性所迷惑,所以任何其他的建议都会很好

您必须将
tickmode
激活为“数组”,然后定义
tickvals
ticktext
,如:

tickmode = 'array',
tickvals = [2050, 2100, 2150, 2200],
ticktext = df['date'])

我不知道你想在这里做什么。。。虽然
orientation
设置为
h
且x值为日期,但您将其称为“垂直条形图”。将条形图的长度指定为日期有点令人担忧:没有明显的零!在这种情况下,条形图从
1970-01-01
(Unix时代的开始)开始,并根据增量水平添加,因此第一个条形图到
2020-01-01
(持续时间为50年),第二个条形图到2070年的时间大致相同,第三个是2120等。这就是为什么你的蜱虫显示为2050、2100等。啊,我明白了,你试图回答。。。是的,要做到这一点,您可能需要设置每个条形图的
base
,并且必须将每个条形图的
x
值设置为对应于1970-01-01T00:00:00+您希望条形图长度的时间跨度的日期。但你也可以考虑使用另一种方法,使用真正的脂肪段,开始日期和结束日期…