如何解决如何正确使用颜色图来绘制表达线地图框?
我无法让 'UserInfoId'
以正确的颜色呈现线条。线条的值为 0..100%,代表每条线条的使用情况。从其他 SO 问题和网站,我是这样处理的:
plotly.express.line_mapbox()
然后我通过以下方式指定每种颜色:
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)
在颜色方面表现得非常奇怪。屏幕截图显示了一条使用值为 9 的行。我不明白为什么它会打印蓝色,甚至不应该在我的颜色范围内。其他颜色为绿色或红色,但与 plotly.express.line_mapbox()
无关。我似乎错过了一些重要的东西。
感谢任何帮助:)
解决方法
所以我设法解决了我的问题,并想分享我的发现,以防有人偶然发现这个问题。在这里您可以找到 docs。
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 or int or Series or array-like) – data_frame 中列的名称,或者 pandas Series 或 array_like 对象。此列或数组中的值用于为标记分配颜色。
然后我研究了 color_discrete_map
参数并使它最终起作用。
color_discrete_map(带有 str 键和 str 值的字典(默认 {}))——字符串值应该定义有效的 CSS-colors 用于覆盖 color_discrete_sequence 以将特定颜色分配给与特定值对应的标记。 color_discrete_map 中的键应该是颜色表示的列中的值。或者,如果颜色的值是有效颜色,则可以传递字符串 'identity' 以直接使用它们。
这就是我创建离散颜色图的方式。我认为这里最重要的问题是使用 N=101
(或您需要的任何值范围)将频谱归一化为 0..100
范围内的值。
# initialize discrete colormap
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("gyr",int(255 * cmap(i)[2]))})
然后将其传递给数字 color_discrete_map
参数:
fig = px.line_mapbox(df,color_discrete_map=discr_map)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。