我通过做一些非常基本的例子来学习Plotly Choropleth映射。我正在世界地图上绘制国家的GDP。我得到的不是色标,而是从较低的GDP到较高的GDP,而是为每个国家/地区提供了一张离散色的地图。
我怀疑这可能与原始数据集中的GDP是一个字符串有关,例如'23,350,230'。我已将其转换为float,并确认该转换有效。
border-right: 2px solid red;
border-bottom: 2px solid red;
border-top: 5px solid black;
我还尝试过为 border-top: 5px solid black;
,including once from here使用其他值,并将所有参数一起删除,结果仍然是同一张具有离散颜色的贴图。
请告诉我我做错了,谢谢!
编辑
要重现该问题: 数据集来自Kaggle,可以here下载。它的格式不是很好,有很多空/冗余行和3个空列,因此我做了一些步骤来预处理数据。顺便说一下,如果预处理很粗糙,那么如果您对我的改进方法有任何建议,非常欢迎!
fig = px.choropleth(df, locations="Code",
color="GDP",
hover_name="Country",
color_continuous_scale=px.colors.sequential.Plasma)
fig.show()
该似乎可以工作,从不调用最后一个循环中的color_continuous_scale
,并且数据框看起来很干净。因此,当我使用上面的代码创建已创建的choropleth贴图时,数据正确显示在左侧的栏中,但是颜色是离散的。 Here's the screenshot of the map I get.
答案 0 :(得分:1)
您的猜想是正确的,有可能将GDP视为字符串,因此使用了不连续的颜色。使用str.replace
从csv数据中删除逗号(然后转换为float)。像这样:
df["GDP"] = df["GDP"].str.replace(",","").astype(float)
这将在df.columns = ['Code', 'Rank', 'Country', 'GDP']
之后执行,然后删除for
循环。
完整代码:
import pandas as pd
import plotly.express as px
df = pd.read_csv("gdp-csv-.csv", encoding = "ISO-8859-1")
df = df.drop(['Unnamed: 2', 'Unnamed: 5', 'Unnamed: 6'], axis=1)
df = df.drop(['Unnamed: 9', 'Unnamed: 10', 'Unnamed: 7', 'Unnamed: 8'], axis=1)
df = df.drop(df.index[0:4])
df = df.drop(df.index[195:])
df = df.drop(df.index[-4:])
df.columns = ['Code', 'Rank', 'Country', 'GDP']
df["GDP"] = df["GDP"].str.replace(",","").astype(float)
fig = px.choropleth(df, locations="Code",
color="GDP",
hover_name="Country",
color_continuous_scale=px.colors.sequential.Plasma)
fig.show()
顺便说一句,引入csv的一种更干净的方法是用usecols
指定列,用skiprows
指定行,请参见here:
df = pd.read_csv("gdp-csv-.csv", encoding = "ISO-8859-1", usecols=[0,1,3,4], skiprows=4,
skipfooter=122, engine='python')
df.columns = ['Code', 'Rank', 'Country', 'GDP']
df["GDP"] = df["GDP"].str.replace(",","").astype(float)
编辑:将skipfooter
添加到pd.read_csv