如何正确使用颜色图来绘制表达线图框?

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

我无法

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

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()

python express plotly mapbox colormap
2个回答
1
投票

所以我设法解决了我的问题,并想分享我的发现,以防有人偶然发现这个问题。在这里您可以找到文档

TL;DR 以及我的主要收获:

使用带有

dict
键和十六进制颜色(
str
)的离散颜色图(
str
),而
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)

我不太明白,为什么

dataframe
colors
列不适用于
rgb(255,100,0)
格式。也许这里也需要十六进制格式 - 我有时会检查一下。这很令人困惑,因为其他
mapbox
可以处理
rgb
格式。因此,它又回到了标准颜色范围,这显然让我感到困惑。

color (str 或 int 或 Series 或 array-like) – data_frame 中列的名称,或者 pandas Series 或 array_like 对象。此列或 array_like 中的值用于为标记分配颜色。

然后我研究了

color_discrete_map
的论点并最终成功了。

color_discrete_map(带有 str 键和 str 值的字典(默认为 {})) – 字符串值应定义有效的 CSS 颜色 用于覆盖 color_discrete_sequence 以将特定颜色分配给与特定值对应的标记。 color_discrete_map 中的键应该是由颜色表示的列中的值。或者,如果 color 的值是有效颜色,则可以传递字符串“identity”以使它们直接使用。

这就是我创建离散颜色图的方法。我认为这里最重要的问题是使用

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]))})

然后将其传递到数字

color_discrete_map
参数中:

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

0
投票

如果你想在 px.line_mapbox 中使用比例颜色。

您可以使用 buffer(set_distance) 将线串几何图形修改为多边形几何图形。

示例: gdf["几何"] = gdf['几何'].apply(lambda x: x.buffer(set_distance))

之后,您可以将 px.choropleth_mapbox 与 color_continuous_scale 一起使用。

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