我想使用
choropleth plotly
用我的数据创建一个全球地图。问题是我的数据有几个数量级的差异范围。我尝试使用对数刻度绘制数据,但它确实产生了预期的结果。我想在我的数据中创建自定义 bin 或 ticks。我该怎么做?我花了两天时间尝试了几次,但没有结果。
这是我的代码:
fig = px.choropleth(df, locations='value', color=np.log10(df['value'].replace(0, np.nan)),
color_continuous_scale="YlOrRd",
# range_color=(0, 12),
)
fig.update_layout(coloraxis_colorbar=dict(
title="Value",
tickvals=[1E-22,1E-10,1E-9,1E-8,1E-7,4.3E-06],
ticktext=["<E-10","1E-10", "1E-9","1E-8","1E-7","4.3E-06"],
# lenmode="pixels", len=100,
))
fig.show()
看起来像
go.Choropleth
和 colorscale
和 colorbar
作品:
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Choropleth(
locations=df["Country Code"].values,
z=df["Log Value"].values,
colorscale=your_colorscale,
],
colorbar=dict(
tick0=18, # start
dtick=2 # step
)
))
fig.show()
your_colorscale
应该是这样的格式:
your_colorscale = [
# Let first 10% (0.1) of the values have color rgb(0, 0, 0)
[0, "rgb(0, 0, 0)"],
[0.1, "rgb(0, 0, 0)"],
# Let values between 10-20% of the min and max of z
# have color rgb(20, 20, 20)
[0.1, "rgb(20, 20, 20)"],
[0.2, "rgb(20, 20, 20)"],
# Values between 20-30% of the min and max of z
# have color rgb(40, 40, 40)
[0.2, "rgb(40, 40, 40)"],
[0.3, "rgb(40, 40, 40)"]
# And so on
]
注意值 0.1 和 0.2 出现了两次。看起来制作一个离散的颜色条很重要,而不是连续的。
另一种选择是将数据拆分为 bin,然后将其绘制为分类变量。
您使用
pd.cut
将值分成箱子
df["cut"] = pd.cut(df["variable"].values, your_bins, include_lowest=True)
df["cut"].cat.categories = ["name1", "name2", "name3", "name4", "name5"]
之后,绘制您的地图,但将
color_continuous_scale
替换为color_discrete_map
color_discrete_map = dict(zip(
["name1", "name2", "name3", "name4", "name5"],
colors_for_categories
))
fig = px.choropleth(
df, locations="Country Code", color="cut",
color_discrete_map=color_discrete_map
)
fig.show()
但这看起来更复杂。