python - 有什么方法可以绘制印度地图吗?
问题描述
我正在尝试使用 plotly 绘制印度地图,但无法找到这样做的方法。以下是我为美国尝试的代码。
import pandas as pd
df_sample = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/laucnty16.csv')
df_sample['State FIPS Code'] = df_sample['State FIPS Code'].apply(lambda x: str(x).zfill(2))
df_sample['County FIPS Code'] = df_sample['County FIPS Code'].apply(lambda x: str(x).zfill(3))
df_sample['FIPS'] = df_sample['State FIPS Code'] + df_sample['County FIPS Code']
colorscale = ["#f7fbff","#ebf3fb","#deebf7","#d2e3f3","#c6dbef","#b3d2e9","#9ecae1",
"#85bcdb","#6baed6","#57a0ce","#4292c6","#3082be","#2171b5","#1361a9",
"#08519c","#0b4083","#08306b"]
endpts = list(np.linspace(1, 12, len(colorscale) - 1))
fips = df_sample['FIPS'].tolist()
values = df_sample['Unemployment Rate (%)'].tolist()
fig = ff.create_choropleth(
fips=fips, values=values,
binning_endpoints=endpts,
colorscale=colorscale,
show_state_data=False,
show_hover=True, centroid_marker={'opacity': 0},
asp=2.9, title='USA by Unemployment %',
legend_title='% unemployed'
)
fig.layout.template = None
fig.show()
解决方案
create_choropleth
您使用的图形工厂方法已弃用,仅与美国县打交道。对于其他地图,您需要 GeoJSON 来映射要映射的要素。Plotly 仅附带世界国家和美国各州的 GeoJSON 数据,因此您必须自己提供印度各州的数据。
与您的示例 choropleth 一样,让我们绘制截至7 月 17 日每个州的当前活跃 COVID-19 病例数(这来自indiacovid19.github.io,它定期存档来自印度卫生部的数据)。至于 GeoJSON,快速搜索会产生一些 GitHub 存储库,但对于我们的案例数据来说,似乎大多数都已经过时了,因为它们不包括 Dadra 和 Nagar Haveli 以及 Daman 和 Diu 的合并。幸运的是,datameet为印度各州提供了最新的 shapefile,我对其进行了一些简化以减小大小并使用 mapshaper 转换为GeoJSON ,然后使用geojson-rewind翻转多边形绕组。
现在,正如Plotly 文档中所详述的那样,我们可以使用 plotly express 快速使用我们的数据制作等值线图:
import pandas as pd
import plotly.express as px
df = pd.read_csv("https://gist.githubusercontent.com/jbrobst/56c13bbbf9d97d187fea01ca62ea5112/raw/e388c4cae20aa53cb5090210a42ebb9b765c0a36/active_cases_2020-07-17_0800.csv")
fig = px.choropleth(
df,
geojson="https://gist.githubusercontent.com/jbrobst/56c13bbbf9d97d187fea01ca62ea5112/raw/e388c4cae20aa53cb5090210a42ebb9b765c0a36/india_states.geojson",
featureidkey='properties.ST_NM',
locations='state',
color='active cases',
color_continuous_scale='Reds'
)
fig.update_geos(fitbounds="locations", visible=False)
fig.show()
为了更精细地控制绘图,我们可以直接使用图形对象:
import pandas as pd
import plotly.graph_objects as go
df = pd.read_csv("https://gist.githubusercontent.com/jbrobst/56c13bbbf9d97d187fea01ca62ea5112/raw/e388c4cae20aa53cb5090210a42ebb9b765c0a36/active_cases_2020-07-17_0800.csv")
fig = go.Figure(data=go.Choropleth(
geojson="https://gist.githubusercontent.com/jbrobst/56c13bbbf9d97d187fea01ca62ea5112/raw/e388c4cae20aa53cb5090210a42ebb9b765c0a36/india_states.geojson",
featureidkey='properties.ST_NM',
locationmode='geojson-id',
locations=df['state'],
z=df['active cases'],
autocolorscale=False,
colorscale='Reds',
marker_line_color='peachpuff',
colorbar=dict(
title={'text': "Active Cases"},
thickness=15,
len=0.35,
bgcolor='rgba(255,255,255,0.6)',
tick0=0,
dtick=20000,
xanchor='left',
x=0.01,
yanchor='bottom',
y=0.05
)
))
fig.update_geos(
visible=False,
projection=dict(
type='conic conformal',
parallels=[12.472944444, 35.172805555556],
rotation={'lat': 24, 'lon': 80}
),
lonaxis={'range': [68, 98]},
lataxis={'range': [6, 38]}
)
fig.update_layout(
title=dict(
text="Active COVID-19 Cases in India by State as of July 17, 2020",
xanchor='center',
x=0.5,
yref='paper',
yanchor='bottom',
y=1,
pad={'b': 10}
),
margin={'r': 0, 't': 30, 'l': 0, 'b': 0},
height=550,
width=550
)
fig.show()
推荐阅读
- excel - 将记事本数据导入excel(难拆分)
- kotlin - kotlin 中 mutablelistof(2, 'j') 的类型是什么
- kubernetes - 由于 ownerReferences 指向 kubernetes 中不同命名空间中的资源,pod 被终止
- javascript - 如果从下拉列表中选择了*选项 A 或选项 B,则 JS 从列表中返回结果
- javascript - 从另一个列表拖放后,为什么 sortable() 在动态列表中不起作用?
- linux - 如何将参数传递给在 Docker 容器中运行的程序?
- firebase - 颤振和火力:参数类型“字符串?” 不能分配给参数类型“字符串”
- reactjs - 在 React 中的 useEffect 钩子内的 Promise 中设置状态
- django - 模型名称未出现在多项选择字段中
- javascript - 如果抛出错误 - JavaScript,是否可以重试 try-catch 块?