简体   繁体   English

如何使用 plotly 在条形图中添加注释?

[英]How do I add annotations in barplot with plotly?

Currently my plot looks like this:目前我的 plot 看起来像这样:

在此处输入图像描述 Plot, Data and Code: Plot,数据和代码:

df_pub = pd.read_excel('D:\Masterarbeit\Data\Excel/publication_years.xlsx')
fig = px.bar(df_pub, x = 'Publication date', y = 'Freq.')
fig.show()



years = ['80', '81', '82', '83', '84', '85', '86, '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99' ,'00' ,'01', '02', '03', '04' '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19']
freq = [173,1368,2238,4135,5455,6280,7470,6580,7537,8781,10894,14788,20562,27637,32446,32665,30374,28234,24235,22312,16817,20222,24080,30398,30230,27462,33582,28908,31648,26579,29121,31216,34574,34271,32570,32531,43390,46761,55920,34675]

I want to add some annotation below the graph.我想在图表下方添加一些注释。

As suggested by answer:正如答案所建议的:

import pandas as pd
import plotly.express as px

df_pub = pd.read_excel('D:/Masterarbeit/Data/Excel/publication_years.xlsx')
fig = px.bar(df_pub, x = 'Publication date', y = 'Freq.', title = 'Frequency of publicated patents 1980-2019'
            )
annot_y = -0.2
annot_t = 'Figure 1(i) - Patent frequency 1980-2019Q1'

fig.add_annotation(
                                        y=annot_y,
                                        showarrow=False,
                                        text=annot_t,
                                        textangle=0,
                                        xanchor='left',
                                        xref="x",
                                        yref="paper")
fig.show()

在此处输入图像描述

But it is still squewed:/但它仍然被挤压:/

It's not 100% clear which figure you'd like to annotate.您想注释哪个数字并不是 100% 清楚的。 But for now I'm assuming this:但现在我假设:

在此处输入图像描述


You haven't shared a sample of your data, so it's hard to tell for sure.您尚未共享数据样本,因此很难确定。 But it seems to me that your x-values are timestamps and you're usinf x=4 in fig.add_annotation() .So you'll need to make sure that the values you have assigned to the x-axis corresponds to the values you're assigning in fig.add_annotation() .但在我看来,您的 x 值是时间戳,并且您在fig.add_annotation()中使用x=4 。因此,您需要确保分配给 x 轴的值对应于值您在fig.add_annotation()中分配。 Below is a working example that should let you do exactly what you want.下面是一个工作示例,应该可以让您完全按照自己的意愿行事。

Plot: Plot:

在此处输入图像描述

Code:代码:

import numpy as np
import pandas as pd
import plotly.graph_objects as go
import plotly.express as px
import datetime
from plotly.subplots import make_subplots

pd.set_option('display.max_rows', None)

# data sample
nperiods = 50
np.random.seed(123)
df = pd.DataFrame(np.random.randint(-6, 12, size=(nperiods, 2)),
                  columns=['price', 'divergence'])
datelist = pd.date_range(datetime.datetime(2017, 1, 1).strftime('%Y-%m-%d'),periods=nperiods).tolist()
df['date'] = datelist 
df = df.set_index(['date'])
df.index = pd.to_datetime(df.index)
# df.iloc[0] =1000
# df = df.cumsum().reset_index()
df.reset_index(inplace=True)
df['price'] = df['price'].cumsum()
df['divergence'] = df['divergence'].cumsum()

# filtered = df[(df['date'] > '2017-1-24') & (df['date'] <= '2018-1-24')]

fig = make_subplots(specs=[[{"secondary_y": True}]])

fig.add_trace(
    go.Bar(
        x=df['date'], 
        y=df['divergence'],
        #opacity=0.5
    )
)

fig.update_traces(marker_color = 'rgba(0,0,250, 0.5)',
                  marker_line_width = 0,
                  selector=dict(type="bar"))

fig.update_layout(bargap=0,
                  bargroupgap = 0,
                 )

annot_x = df['date'].to_list()[::20]
annot_y = -0.2
annot_t = list('ABC')


for i, x in enumerate(annot_x):
#     print(x)
    fig.add_annotation(dict(font=dict(color='red',size=12),
                                        x=x,
                                        y=annot_y,
                                        showarrow=False,
                                        text=annot_t[i],
                                        textangle=0,
                                        xanchor='left',
                                        xref="x",
                                        yref="paper"))

fig.show()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM