我通过做一些非常基本的例子来学习Plotly Choropleth映射。我正在世界地图上绘制国家的GDP。从低到高的GDP取代了色标,我得到了一个地图,每个国家的颜色都是不连续的。
我怀疑原始数据集中的GDP可能是字符串,例如'23,350,230'。我已将其转换为float,并确认该转换有效。
fig = px.choropleth(df, locations="Code",
color="GDP",
hover_name="Country",
color_continuous_scale=px.colors.sequential.Plasma)
fig.show()
我还尝试过将color_continuous_scale
,including once from here的其他值都使用,并一起删除该参数,结果仍然是同一张具有离散颜色的贴图。
[请告诉我我做错了,谢谢!
编辑
要重现该问题:数据集来自Kaggle,可以下载here。它的格式不是很好,有很多空/冗余行和3个空列,所以我做了一些步骤来预处理数据。顺便说一句,如果预处理很粗糙,那么如果您对我如何进行改进有任何建议,非常欢迎!
df = pd.read_csv("gdp-ppp.csv", encoding = "ISO-8859-1")
df = df.drop(['Unnamed: 2', 'Unnamed: 5', 'Unnamed: 6'], 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']
i = 4
for gdp in df["GDP"]:
gdp = gdp.replace(",", "")
df["GDP"][i] = float(gdp)
i += 1
for gdp in df["GDP"]:
if type(gdp) != type(1.1):
print(gdp)
此似乎起作用,从不调用最后一个循环中的print(gdp)
,并且数据帧看上去很干净。因此,当我使用上面的代码创建已创建的choropleth贴图时,数据正确显示在左侧的栏中,但是颜色是离散的。 Here's the screenshot of the map I get.
您的猜想是正确的,有计划地将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()
btw,引入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