我使用
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()
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
似乎也可以工作。
使用
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_sequence(str列表)——字符串应该定义有效的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'] 构建的。 忽略即可
fig = fig.update_layout(**plotly_format_fig_kwargs.model_dump())