Plotly 显示离散颜色而不是色标

Plotly displays discrete colors instead of a colorscale

我正在通过做一些非常基本的例子来学习 Plotly Choropleth 地图。我正在世界地图上绘制国家/地区的 GDP。我得到了一张地图,每个国家都有不同的颜色,而不是色阶,从较低的 GDP 到较高的 GDP。

我怀疑这可能与原始数据集中的 GDP 是一个字符串有关,例如'23,350,230'。我已将其转换为浮点数,并确认转换有效。

fig = px.choropleth(df, locations="Code",
                    color="GDP",
                    hover_name="Country",
                    color_continuous_scale=px.colors.sequential.Plasma)
fig.show()

我也尝试过为 color_continuous_scaleincluding once from here 使用其他值,并一起删除参数,结果仍然是具有不同颜色的相同地图。

请告诉我哪里做错了,谢谢!


编辑

要重现问题: 数据集来自Kaggle,可以下载here。它的格式不是很好,有很多 empty/redundant 行和 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) 从未被调用,数据框看起来漂亮干净。所以那是当我使用上面的代码创建等值线图时,它已创建,并且数据在左侧的栏中正确显示,但着色是离散的。 Here's the screenshot of the map I get.

您的怀疑是正确的,情节是将 GDP 视为字符串,因此使用离散颜色。使用 str.replace 从 csv 数据中删除逗号(然后转换为浮点数)。类似于:

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