[英]How do I plot a GeoJSON feature collection of line strings in a mapbox using plotly express?
[英]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
。 我似乎錯過了一些重要的東西。
任何幫助表示贊賞:)
所以我設法解決了我的問題,並想分享我的發現,以防有人偶然發現這個問題。 在這里您可以找到文檔。
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)
我真的不明白,為什么在dataframe
的colors
列不以格式工作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.