我用plotly-express绘制了2条线。如何为每一个指定不同的图案,分别为“dash”和“solid”?

问题描述 投票:0回答:2

我使用

plotly-express
Python 库绘制了 2 条线。 我使用
color_discrete_sequence
参数为每个颜色指定不同的颜色。 效果很好。颜色部分还可以。

现在我想为每行指定不同的“模式”。 是否可以以一种方便的方式做到这一点,就颜色而言,只需提供图案列表即可?

我已经尝试了

line_dash_sequence
参数,我希望它是
color_discrete_sequence
的模式对应项。 不幸的是它不起作用:这两行使用第一个模式。

import pandas as pd
import plotly.express as px
from datetime import time

df = pd.DataFrame(
    {
        "timestamp": [time(x) for x in range(24)],
        "power1": [50 * x for x in range(24)],
        "power2": [52 * x for x in range(24)],
    }
)

fig = px.line(
    df,
    x="timestamp",
    y=["power1", "power2"],
    color_discrete_sequence=["orange", "grey"],
    line_dash_sequence=["dash", "solid"],
)

fig.show()

我想我错过了一些东西。 感谢您的帮助。

python plotly plotly-express
2个回答
2
投票

melt
处理数据并将
color
line_dash
与其对应的
color_discrete_map
line_dash_map
似乎有效:

fig = px.line(
    df.melt(id_vars='timestamp', value_vars=['power1', 'power2']),
    x="timestamp",
    y="value",
    color="variable",
    line_dash="variable",
    color_discrete_map={'power1': 'orange', 'power2': 'gray'},
    line_dash_map={'power1': 'dash', 'power2': 'solid'},
)
从宽格式转换为长格式后,

color_discrete_sequence
line_dash_sequence
似乎也可以工作。


0
投票

简而言之

使用

fig = px.line(df, x='x', y=['y', 'y2'])
for i, line_style in enumerate(['dash', 'dot']):
    fig = fig.update_traces(line=dict(dash=line_style), selector=dict(name=['y', 'y2'][i]))

fig.show()

详情

import plotly.express as px
import pandas as pd

# import warnings
# warnings.filterwarnings("ignore")
# warnings.filterwarnings('default')

df = pd.DataFrame(
    {
        'x': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
        'y': [10, 20, 31, 4, 15, 62, 47, 8, 19, 10],
        'y2': [20, 11, 13, 15, 18, 20, 39, 50, 20, 11],
        'column1': ['group1', 'group1', 'group2', 'group2', 'group1', 'group1', 'group1', 'group2', 'group2', 'group2'],
    }
)

print("case: base")
fig = px.line(df, x='x', y=['y', 'y2'])
fig = fig.update_layout(**plotly_format_fig_kwargs.model_dump())
fig.show()

print("case: fail -- try line_dash_sequence")
fig = px.line(df, x='x', y=['y', 'y2'], line_dash='column1', line_dash_sequence=['dash', 'dot'])
fig = fig.update_layout(**plotly_format_fig_kwargs.model_dump())
fig.show()

print("case: invesitage line_dash_sequence, find out its not for this usage")
fig = px.line(df, x='x', y='y', line_dash='column1', line_dash_sequence=['dash', 'dot'])
fig = fig.update_layout(**plotly_format_fig_kwargs.model_dump())
fig.show()

print("case: success -- use update_traces")
fig = px.line(df, x='x', y=['y', 'y2'])
for i, line_style in enumerate(['dash', 'dot']):
    fig = fig.update_traces(line=dict(dash=line_style), selector=dict(name=['y', 'y2'][i]))
fig = fig.update_layout(**plotly_format_fig_kwargs.model_dump())
fig.show()

其他

  • 检查

    line_dash_sequence

    的API

    line_dash_sequencestr列表)——字符串应该定义有效的plotly.js破折号模式。设置

    line_dash
    后,该列中的值将按照
    line_dash_sequence
    中所述的顺序循环遍历
    category_orders
    来分配破折号图案,除非
    line_dash
    的值是
    line_dash_map
    中的键。

    https://plotly.com/python-api-reference/ generated/plotly.express.line

  • line_dash_sequence确实很奇怪......
    它是为

    melt
    数据框构建的,而不是为多列情况 y=['y', 'y2'] 构建的。
    不知道为什么,希望有更好的 api。

  • 忽略即可

    fig = fig.update_layout(**plotly_format_fig_kwargs.model_dump())

© www.soinside.com 2019 - 2024. All rights reserved.