簡體   English   中英

如何正確使用顏色圖來繪制表達線地圖框?

[英]How to correctly use colormaps for plotly express line mapbox?

我無法讓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而言,我正在使用每行數據構建我的數據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()

所以我設法解決了我的問題,並想分享我的發現,以防有人偶然發現這個問題。 在這里您可以找到文檔

TL;DR和我的主要收獲:

使用離散色彩映射( dict )與str -keys和己顏色( 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)

我真的不明白,為什么在dataframecolors列不以格式工作rgb(255,100,0) 也許這里也需要十六進制格式 - 有時間我會檢查一下。 這令人困惑,因為其他mapbox可以處理rgb格式。 出於這個原因,它正在回落到它的標准顏色范圍,這顯然讓我感到困惑。

color (str or int or Series or array-like) – data_frame 中列的名稱,或者 pandas Series 或 array_like 對象。 此列或array_like 中的值用於為標記分配顏色。

然后我查看了color_discrete_map參數並使其最終起作用。

color_discrete_map (dict with str keys and str values (default {})) – 字符串值應該定義有效的 CSS-colors 用於覆蓋 color_discrete_sequence 以將特定顏色分配給與特定值對應的標記。 color_discrete_map 中的鍵應該是顏色表示的列中的值。 或者,如果顏色的值是有效顏色,則可以傳遞字符串 '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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM