我无法
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
无关。我似乎错过了一些重要的事情。
任何帮助表示赞赏:)
所以我设法解决了我的问题,并想分享我的发现,以防有人偶然发现这个问题。在这里您可以找到文档。
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)
如果你想在 px.line_mapbox 中使用比例颜色。
您可以使用 buffer(set_distance) 将线串几何图形修改为多边形几何图形。
示例: gdf["几何"] = gdf['几何'].apply(lambda x: x.buffer(set_distance))
之后,您可以将 px.choropleth_mapbox 与 color_continuous_scale 一起使用。