使用 Plotly 在面积图上添加一条具有适当比例的线

Posted

技术标签:

【中文标题】使用 Plotly 在面积图上添加一条具有适当比例的线【英文标题】:Add a line with its proper scale on an area chart with Plotly 【发布时间】:2021-03-08 14:15:45 【问题描述】:

我有以下代码:

import pandas as pd
import plotly.express as px
fig = px.area(df, x="Decade", y="Financial_Impact", color="Disaster_Type", title="Financial Impact, World, RCP = 2.6", color_discrete_sequence=["#FDB714", "#009CA7", "#F05023"])
fig.show()

生成如下面积图:

现在我有一个名为 C 的变量,提供每十年的温度 (°C)。如何在图表右侧添加一条显示C 的线,其比例相对于C

这是数据集的前五行:

df.head()

【问题讨论】:

你能分享你的 DataFrame 以便人们重现输出吗? 数据是通过这两个脚本生成的:github.com/dataforgoodfr/batch8_worldbank/blob/master/Dashboard/…和github.com/dataforgoodfr/batch8_worldbank/blob/master/Dashboard/… 【参考方案1】:
import plotly.express as px
from plotly.subplots import make_subplots

subfig = make_subplots(specs=[["secondary_y": True]])

fig = px.area(df, x="Decade", y="Financial_Impact", color="Disaster_Type", color_discrete_sequence=["#FDB714", "#009CA7", "#F05023"])
fig2 = px.line(df, x="Decade",y=df.C)

fig2.update_traces(yaxis="y2",showlegend=True,name='Temperature')
subfig.add_traces(fig.data + fig2.data)

subfig.layout.xaxis.title="Decades"
subfig.layout.yaxis.title="Financial Impact"
subfig.layout.yaxis2.title="°C"
subfig.layout.title="Financial Impact, World, RCP = 2.6"

subfig.show()

【讨论】:

很高兴知道这也有效!我通常更喜欢 graph_objects 而不是 Plotly Express,因为它更容易调整,但在你的情况下,它看起来节省了很多代码行。【参考方案2】:

您将希望使用 graph_objects 而不是 Plotly express,使用 go.Scatterstackgroup 参数将数据添加为轨迹以创建重叠区域图,并创建辅助 y 轴。您可以为温度数据指定辅助 y 轴。我将创建一个与您类似的 DataFrame 来说明我的观点。

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

np.random.seed(42)
storm_data = np.repeat(3.5*10**9,21) + 10**8*np.random.normal(0,1,21)
flood_data = np.repeat(2*10**9,21) + 10**8*np.random.normal(0,1,21)
drought_data = np.repeat(1.4*10**9,21) + 10**8*np.random.normal(0,1,21)

df = pd.DataFrame(
    'Decade':np.linspace(1900,2100,21), 
    'Storms':storm_data, 
    'Floods':flood_data, 
    'Droughts':drought_data, 
    'Temperature':np.random.normal(30,10,21)
)

## create a secondary y-axis
fig = make_subplots(specs=[["secondary_y": True]])

## add your data using traces
fig.add_trace(go.Scatter(
    x=df.Decade,
    y=df.Storms,
    name='Storms',
    stackgroup='one'
))

fig.add_trace(go.Scatter(
    x=df.Decade,
    y=df.Floods,
    name='Floods',
    stackgroup='one'
))

fig.add_trace(go.Scatter(
    x=df.Decade,
    y=df.Droughts,
    name='Droughts',
    stackgroup='one'
))

## specify the secondary y_axis for temperature
fig.add_trace(go.Scatter(
    x=df.Decade,
    y=df.Temperature,
    name='Temperature',
    ),
    secondary_y=True
)

fig.show()

【讨论】:

谢谢,是否可以只用一条线表示温度(即没有彩色区域)? 是的,当然!我们可以去掉stackgroup参数

以上是关于使用 Plotly 在面积图上添加一条具有适当比例的线的主要内容,如果未能解决你的问题,请参考以下文章

Plotly.js:覆盖两个具有相同 x 轴和不同 y 轴比例的不同图形

使用 Plotly 在等高线图上叠加线

在二分图上加一条边与其逆问题

plotly vs seaborn:python中的小提琴情节

Plotly:如何在 Barpolar 图上添加 Scatterpolar?

Plotly:如何使用 plotly.graph_objects 将两个 3D 图放在同一个图上?