前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python绘图 | 空间地图上散点气泡绘制

python绘图 | 空间地图上散点气泡绘制

作者头像
郭好奇同学
发布2020-11-17 10:42:59
2.2K0
发布2020-11-17 10:42:59
举报
文章被收录于专栏:好奇心Log好奇心Log

今天的推文教程使用geopandas进行空间图表的绘制(geopandas空间绘图很方便,省去了很多的数据处理过程,而且也完美衔接matplotlib,学习python 空间绘图的小伙伴可以看下啊),具体为空间气泡图的绘制,主要涉及的内容如下:

  • geopandas geojson数据格式读取并可视化展示
  • 单独添加散点大小图例图层
  • adjustText 库解决文本重叠问题

geopandas geojson数据操作

这里我们选择的为香港地图的geojson 文件数据,此类文件可在DAtAV 地图选择器进行下载。下载所得的文件名为香港特别行政区.json,可视化效果如下:

数据读取

使用geopandas 的read_file()方法就可很方便的进行数据读取,代码如下:

代码语言:javascript
复制
hk_file = r"F:\DataCharm\商业艺术图表仿制\香港地图可视化\香港特别行政区.json"
hk = geopandas.read_file(hk_file)

更多geopandas 读取数据方法,可以参看geopandas官网进行学习了解。

数据可视化展示

在读取完数据之后,我们可以直接使用geopandas的plot() 方法进行绘制,代码如下(做了简单的颜色设置):

代码语言:javascript
复制
fig, ax = plt.subplots(figsize=(10,8),dpi=200)

hk_map = hk.geometry.plot(ax=ax,fc="#CCEBEB",ec="#009999",lw=1)
ax.text(.91,0.05,'\nVisualization by DataCharm',transform = ax.transAxes,
        ha='center', va='center',fontsize = 8)

ax.axis('off') # 移除坐标轴
plt.savefig('hk_charts_pir.png',width=8,height=8,
            dpi=900,bbox_inches='tight',facecolor='white')

结果如下:

  • 区名文本添加:在读取的数据结果中有name 列为对应的区名,使用hk.geometry.representative_point() 方法计算出其代表性 点的经纬度信息用于绘制文本位置,结果如下:

再通过使用ax.text()方法添加文本即可,代码如下:

代码语言:javascript
复制
for loc, label in zip(hk.geometry.representative_point(),hk.name):
    ax.text(loc.x,loc.y,label,size=13,color="#0DCFE3")

结果如下:

添加气泡散点数据

这里的数据来源为我的朋友J哥的公号:菜J学Python,感谢提供数据支持。由于数据的经纬度是直接基于高德地图进行解析的,导致存在部分数据经纬度信息出错,我们使用pandas进行简单的数据筛选,具体就不再展示,后面会推出系列教程推文,数据预览如下:

这里主要使用红色框中的数据进行绘制,即使用scatter()方法加合理设置散点大小即可,代码如下:

代码语言:javascript
复制
for x,y,price in zip(scatter_se.lon,scatter_se.lat,scatter_se['实用单价']):
    hk_map.scatter(x,y,s=price/500,color='#FFEB3B',alpha=.5,ec='k',lw=.1)

经过一些定制化设置效果如下:

气泡图例添加

这里我们不是直接基于数据进行图例的生成,而是单独进行其他图层的绘制进行图例生成,这样做的好处就是可以更加自由定制所需图例的颜色和大小,涉及的代码如下:

代码语言:javascript
复制
#这里进行单独的图例添加
ax.scatter([], [], c='#FFEB3B', s=6000/500,
            label='6000 - 10000', edgecolor='black',lw=.5)
ax.scatter([], [], c='#FFEB3B', s=10000/500,
            label='10000 - 30000', edgecolor='black',lw=.5)
ax.scatter([], [], c='#FFEB3B', s=30000/500,
            label='30000 - 50000', edgecolor='black',lw=.5)
ax.scatter([], [], c='#FFEB3B', s=50000/500,
            label='50000 - 90000', edgecolor='black',lw=.5)
#图例定制化设置
legend = ax.legend(frameon=False,ncol=4,loc='lower right',title='实用单价',bbox_to_anchor=(1, -.06),
                  fontsize=9)
legend.get_title().set_color('#ffffff')
for text in legend.get_texts():
    text.set_color("#ffffff")

注意下代码的后半部分,这是对matplotlib 图例设置的定制化设定,也适用于其他图例。绘图完整代码如下:

代码语言:javascript
复制
fig, ax = plt.subplots(figsize=(10,8),dpi=200,facecolor='#323332',edgecolor='#323332')
ax.set_facecolor('#323332')
hk_map = hk.geometry.plot(ax=ax,fc="#292200",ec="gray",lw=1,alpha=.8)

#使用默认的text添加文本导致文本重叠
for loc, label in zip(hk.geometry.representative_point(),hk.name):
    ax.text(loc.x,loc.y,label,size=11,color="#0DCFE3")
for x,y,price in zip(scatter_se.lon,scatter_se.lat,scatter_se['实用单价']):
    hk_map.scatter(x,y,s=price/500,color='#FFEB3B',alpha=.5,ec='k',lw=.1)

ax.axis('off') # 移除坐标轴

#这里进行单独的图例添加
ax.scatter([], [], c='#FFEB3B', s=6000/500,
            label='6000 - 10000', edgecolor='black',lw=.5)
ax.scatter([], [], c='#FFEB3B', s=10000/500,
            label='10000 - 30000', edgecolor='black',lw=.5)
ax.scatter([], [], c='#FFEB3B', s=30000/500,
            label='30000 - 50000', edgecolor='black',lw=.5)
ax.scatter([], [], c='#FFEB3B', s=50000/500,
            label='50000 - 90000', edgecolor='black',lw=.5)
#图例定制化设置
legend = ax.legend(frameon=False,ncol=4,loc='lower right',title='实用单价',bbox_to_anchor=(1, -.06),
                  fontsize=9)
legend.get_title().set_color('#ffffff')
for text in legend.get_texts():
    text.set_color("#ffffff")
#添加必要的文本:这里title也是采用相同方法
ax.text(.5,1.05,"香港在售二手房分布图",transform = ax.transAxes,color="white",weight='bold',size=20,
       ha='center', va='center')
ax.text(.5,.985,'数据来源:菜J学Python',transform = ax.transAxes,
        ha='center', va='center',fontsize = 10,color='white')
ax.text(.91,-.07,'\nVisualization by DataCharm',transform = ax.transAxes,
        ha='center', va='center',fontsize = 8,color='white')

plt.savefig('hk_charts.png',width=8,height=8,
            dpi=900,bbox_inches='tight',facecolor='#323332')
#ax.set_axisbelow(True)
plt.show()

可视化效果:

adjustText 库解决文本重叠问题

大家可能发现:结果图中文本较集中,可能对阅读造成不便,我们这里只用adjustText 包进行解决,这里给出文本添加的代码,其他步骤一样:

代码语言:javascript
复制
from adjustText import adjust_text
# 使用adjustText修正文字重叠现象
new_texts = [ax.text(loc.x,loc.y,label,size=13,color="#0DCFE3") for loc, label in \
             zip(hk.geometry.representative_point(),hk.name)]
adjust_text(new_texts, 
            only_move={'text': 'xy'},)

可视化结果如下:

总结

本期推文介绍了使用geopandas 进行空间绘图,完整代码不是很多,但涉及的知识点较多,希望大家可以掌握。另外,这个房价的数据是基于爬虫获取,大家对于如“数据获取-数据处理分析-数据可视化” 等一个完整的项目流程感觉怎样?如果受众较大,我后面也会针对性的进行推文准备的,大家可以在 读者讨论 区讨论留言。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 好奇心Log 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • geopandas geojson数据操作
    • 数据读取
      • 数据可视化展示
        • 添加气泡散点数据
          • 气泡图例添加
            • adjustText 库解决文本重叠问题
            • 总结
            相关产品与服务
            灰盒安全测试
            腾讯知识图谱(Tencent Knowledge Graph,TKG)是一个集成图数据库、图计算引擎和图可视化分析的一站式平台。支持抽取和融合异构数据,支持千亿级节点关系的存储和计算,支持规则匹配、机器学习、图嵌入等图数据挖掘算法,拥有丰富的图数据渲染和展现的可视化方案。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档