Plotly:如何在折线图中添加水平线?

21

我用以下代码制作了一个折线图,并试图在y=1处添加一条水平线。 我尝试按照plotly网站上的说明进行操作,但仍然无法显示。 有人知道原因吗?

我用以下代码制作了一个折线图,并试图在y=1处添加一条水平线。 我尝试按照plotly网站上的说明进行操作,但仍然无法显示。 有人知道原因吗?

date = can_tot_df.date
growth_factor = can_tot_df.growth_factor

trace0 = go.Scatter(
            x=date,
            y=growth_factor,
            mode = 'lines',
            name = 'growth_factor'
)

fig = go.Figure()
fig.add_shape(
        type='line',
        x0=date.min(),
        y0=1,
        x1=date.max(),
        y1=1,
        line=dict(
            color='Red',
        )
)


data = [trace0]
iplot(data)

1
如果您已经得到了所需的答案,请考虑将其中一个建议标记为被接受的解决方案。 - vestland
5个回答

23

您还可以使用 fig.add_hline(y=1) --> 请参见https://plotly.com/python/horizontal-vertical-shapes/

import plotly.graph_objects as go
import numpy as np

x = np.arange(10)

fig = go.Figure(data=go.Scatter(x=x, y=x**2))
fig.add_hline(y=40, line_width=3, line_dash="dash", line_color="green")


fig.show()

20

简短回答和通用解决方案:

fig.add_shape(type='line',
                x0=0,
                y0=40,
                x1=8,
                y1=40,
                line=dict(color='Red',),
                xref='x',
                yref='y'
)

关于OP问题的细节和具体信息

没有数据样本很难准确地确定问题所在。但我可以确定的是,你需要添加参数xrefyref来指定线条是按照y轴和x轴的单位绘制的。根据你提供的示例代码,这似乎是你想要做的,因为你正在以日期来指定x值。

此外,对于更新版本的plotly,你不需要担心iplot。你只需运行fig.show()就可以轻松显示图表。下面的图和代码示例将向你展示如何使用fig.show()并如何定义线条的轴单位。

图表:

enter image description here

代码:

import plotly.graph_objects as go
import numpy as np

x = np.arange(10)

fig = go.Figure(data=go.Scatter(x=x, y=x**2))

fig.add_shape(type='line',
                x0=0,
                y0=40,
                x1=8,
                y1=40,
                line=dict(color='Red',),
                xref='x',
                yref='y'
)


fig.show()

除了xref='x'之外,还有一个选择是xref='paper'。现在您可以将x0指定为介于01之间的浮点数,跨越整个绘图的开始和结尾。


1
谢谢。我是计算机科学的新手。你能推荐一些适合像我这样的初学者的好的Plotly教程吗?目前我只是从Plotly网站上复制和粘贴一些东西,对于它们的含义一无所知。 - gboge
@gboge - 老实说,我学习plotly的方式就是不断地使用它,并经常参考文档——这些文档做得非常好。对我帮助最大的事情就是意识到数据结构只是一堆listdict。祝一切顺利! - S3DEV
1
@gboge Plotly的团队为他们的产品准备了绝对精彩的文档。您可以在这里找到所有内容。并且您可以在入门指南基础知识中找到一些很棒的细节。 - vestland
@gboqe 要了解 Plotly 图表的数据和布局结构,可以查看这里。该网站提供了非常棒的可视化展示。 - vestland

4

如果你使用子图,那么这是我找到的向子图添加另一条线的最简单方法。下面的示例在所有x值处绘制y = 80的水平线。

from plotly.subplots import make_subplots

fig = make_subplots(rows=2, cols=1,
                    shared_xaxes=True,
                    vertical_spacing=0.02)
[some graph]

fig.add_trace(go.Scatter(
        name='Y=80',
        x = [df['date'].min(), df['date'].max()],
        y = [80, 80],
        mode = "lines",
        marker = dict(color = 'rgba(80, 26, 80, 0.8)')
    ),row=1, col=1)

我在GitHub上找到了解决方案:


非常方便,谢谢。 - uniquegino

2
df = df
fig = px.scatter(df, x="date", y="growth_factor", mode = 'lines',
      hover_name=df['growth_factor'] )

fig.update_layout(shapes=[
dict(
  type= 'line',
  yref= 'y', y0= 1, y1= 1,   # adding a horizontal line at Y = 1
  xref= 'paper', x0= 0, x1= 1
     ) 
])

fig.show()


1
你正在向 fig 对象添加行,但是 iplot() 函数中只传递了 data,没有传递 fig。因此,只有跟踪被绘制。
如果您使用的是较新版本的 Plotly,则可以简单地使用 fig 对象创建此图,如下所示:
from plotly import graph_objects as go

fig = go.Figure()

# Contrived dataset for example.
x = [1, 2, 3, 4]
y = [i**2 for i in x]

fig.add_trace(go.Scatter(
              x=x,
              y=y,
              mode = 'lines',
              name = 'growth_factor'))

fig.add_shape(type='line',
              x0=min(x),
              y0=5,
              x1=max(x),
              y1=5,
              line=dict(color='Red'))

fig.update_shapes(dict(xref='x', yref='y'))

fig.show()

这里是方便起见的plotly文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接