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_scale
、including 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
我正在通过做一些非常基本的例子来学习 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_scale
、including 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