首页 > 解决方案 > Plotly:如何为每个变量创建具有不同样式和颜色的线图?

问题描述

我正在尝试使用 Plotly express 创建一个包含 10 条不同颜色和标记的不同线条的图表。与此类似的东西:

在此处输入图像描述

px.line我可以使用文档建议的函数创建一个具有不同颜色的漂亮图形。我的代码如下所示:

import plotly.express as px
import numpy as np
import pandas as pd

rand_elems = []
for i in range(10):
    rand_elems.append(np.random.randn(25))

data = pd.DataFrame(rand_elems)

px.line(data_frame=data.T)

我的折线图如下所示:

在此处输入图像描述

其中每个变量是一个 (25,) numpy 数组,其中包含来自标准正态分布的随机值(使用 创建np.random.randn(25))。

有没有办法可以为每一行添加不同的样式?也欢迎使用其他绘图库,因为我在 Plotly 的文档中找不到解决方案。

我知道我可以使用的线条样式是有限的。也许我可以循环浏览它们和颜色?对此有什么好的解决方案?

编辑:图表的目的仅仅是为了表明信号是随机的并且在标准正态分布范围内。

标签: pythongraphplotlyplotly-python

解决方案


px.line非常适合高度多样性的数据集,例如跨越几大洲的一系列国家/地区的不同类别,因为您可以使用诸如 , 之类的参数来区分类别color = 'countryline_dash = 'continent从而为它们分配颜色和形状。这是一个使用内置数据集子集的示例px.data.gapminder()

情节 1

在此处输入图像描述

代码 1

import plotly.express as px
from plotly.validators.scatter.marker import SymbolValidator

# data
df = px.data.gapminder()
df = df[df['country'].isin(['Canada', 'USA', 'Norway', 'Sweden', 'Germany'])]

# plotly
fig = px.line(df, x='year', y='lifeExp',
              color='country',
              line_dash = 'continent')
fig.show()

但是您似乎也对标记的不同形状color感兴趣,并且对于那些像和一样易于使用的标记似乎没有内置功能line_shape。因此,接下来是一种循环使用可用标记形状并将其应用于不同国家的方法。您当然可以通过从标记样式中选择形状来定义自己的序列,例如:

['arrow-bar-left', 'asterisk', 'arrow-right', 'line-ne', 'circle-cross', 'y-left']

但是您也可以基于 获取一堆样式raw_symbols = SymbolValidator().values,稍微改进这些发现并将它们添加到例如国家名称中。

这是结果

在此处输入图像描述

这是你如何做到的:

import plotly.express as px
from itertools import cycle

# data
df = px.data.gapminder()
df = df[df['country'].isin(['Canada', 'USA', 'Norway', 'Sweden', 'Germany'])]

# plotly
fig = px.line(df, x='year', y='lifeExp',
              color='country',
              line_dash = 'continent')

# retrieve a bunch of markers
raw_symbols = SymbolValidator().values
namestems = []
namevariants = []
symbols = []
for i in range(0,len(raw_symbols),3):
    name = raw_symbols[i+2]
    symbols.append(raw_symbols[i])
    namestems.append(name.replace("-open", "").replace("-dot", ""))
    namevariants.append(name[len(namestems[-1]):])
markers = cycle(list(set(namestems)))

# set unique marker style for different countries
fig.update_traces(mode='lines+markers')
for d in fig.data:
    d.marker.symbol = next(markers)
    d.marker.size = 10
fig.show()

推荐阅读