如何正确使用plotly express line mapbox的彩色贴图?

2024-10-03 23:30:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难让plotly.express.line_mapbox()用正确的颜色呈现线条。这些行的值为0..100%,表示每行的使用情况。从其他SO问题和网站上,我是这样处理的:

norm = matplotlib.colors.Normalize(0, 100)
colors = [[norm(0), "green"],[norm(60), "yellow"],[norm(100), "red"]]
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", colors)

然后,我通过以下方式指定每种颜色:

RGBa = cmap(percUsage)    
colors.append(f'rgb({int(255 * RGBa[0])}, {int(255 * RGBa[1])}, {int(255 * RGBa[2])})')

其中percUsage = 0..100

关于这一点,我正在用每行数据构建我的Dataframe,然后创建图形

df = pd.DataFrame(data=dict(name=names, lat=lats, lon=lons, load=loads, color=colors, hover=hoverText))
fig = px.line_mapbox(df, lat='lat', lon='lon', line_group='name', color='color')

但是,尽管c.test_colormap(cmap)显示了预期的颜色,但plotly.express.line_mapbox()在颜色方面表现得完全怪异。屏幕截图显示了使用值为9的一行。我不明白,为什么它会打印出蓝色,它甚至不应该出现在我的颜色光谱中。其他颜色为绿色或红色,但与percUsage无关。我似乎错过了一些重要的事情

感谢您的帮助:)

c.test_colormap(cmap)plotly.express.line_mapbox()


Tags: normmatplotlib颜色lineplotlymapboxcolorint
1条回答
网友
1楼 · 发布于 2024-10-03 23:30:21

所以我设法解决了我的问题,并愿意分享我的发现,以防有人在这个问题上绊倒。在这里您可以找到docs

TL;DR和我的主要收获:

使用带有str键和十六进制颜色(str)的离散颜色映射(dict),而dataframes的(df)“颜色”列则用discr_map中使用的对应键填充

from colormap import rgb2hex
import matplotlib.colors

cmap = matplotlib.colors.LinearSegmentedColormap.from_list("gyr", [[0., 'green'], [0.5, 'yellow'], [1.0, 'red']], N=101)
discr_map = {}
for i in range(0, 101, 1):
    discr_map.update({"c"+str(i): rgb2hex(int(255 * cmap(i)[0]), int(255 * cmap(i)[1]), int(255 * cmap(i)[2]))})

fig = px.line_mapbox(df, lat='lat', lon='lon', line_group='name', color='color', color_discrete_map=discr_map)

我真的不明白dataframecolors列为什么不能使用rgb(255,100,0)格式。也许这里也需要十六进制格式-我会在某个时候检查一下。这令人困惑,因为其他mapbox可以处理rgb格式。由于这个原因,它正在回落到它的标准颜色范围,这显然让我感到困惑

color (str or int or Series or array-like) – Either a name of a column in data_frame, or a pandas Series or array_like object. Values from this column or array_like are used to assign color to marks.

然后我研究了color_discrete_map参数,并使其最终起作用

color_discrete_map (dict with str keys and str values (default {})) – String values should define valid CSS-colors Used to override color_discrete_sequence to assign a specific colors to marks corresponding with specific values. Keys in color_discrete_map should be values in the column denoted by color. Alternatively, if the values of color are valid colors, the string 'identity' may be passed to cause them to be used directly.

这就是我创建离散颜色贴图的方式。我认为这里最重要的一点是使用N=101(或任何您需要的值范围)将频谱规格化为0..100范围内的值

# initialize discrete colormap
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("gyr", [[0., 'green'], [0.5, 'yellow'], [1.0, 'red']], N=101)
discr_map = {}
for i in range(0, 101, 1):
    discr_map.update({"c"+str(i): rgb2hex(int(255 * cmap(i)[0]), int(255 * cmap(i)[1]), int(255 * cmap(i)[2]))})

然后将其传递到figurescolor_discrete_map参数中:

fig = px.line_mapbox(df, lat='lat', lon='lon', line_group='name', color='color', color_discrete_map=discr_map)

相关问题 更多 >