python - 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 的文档中找不到解决方案。
我知道我可以使用的线条样式是有限的。也许我可以循环浏览它们和颜色?对此有什么好的解决方案?
编辑:图表的目的仅仅是为了表明信号是随机的并且在标准正态分布范围内。
解决方案
px.line
非常适合高度多样性的数据集,例如跨越几大洲的一系列国家/地区的不同类别,因为您可以使用诸如 , 之类的参数来区分类别color = 'country
,line_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()
推荐阅读
- javascript - 根据值过滤 JavaScript 深度嵌套的对象数组
- docker - Docker hub 自动构建因缺少变量而下降
- java - Java:在开关内创建的类的访问对象
- firebase - Cloud Firestore 在事件中返回未定义
- javascript - 事件触发但并非所有代码都被执行
- web-testing - 我可以为我的本地主机网站或离线使用 pagespeed 见解吗?
- prolog - 尝试将兄弟姐妹添加到具有一个孩子的二叉树中的每个节点,以便所有节点都有 2 个或零个孩子。换句话说,没有节点有 1 个孩子
- c# - 包含在 Entity Framework Core 中
- reactjs - 无法在生产版本中解码下载的字体(语义 UI React)
- spring - @Autowired 字段为空