Python 空间绘图 - 房价气泡图绘制

DataCharm 2021-02-22 13:02:42
Python 空间 绘图 气泡 房价


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

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

geopandas geojson数据操作

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

数据读取

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

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

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

数据可视化展示

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

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()方法添加文本即可,代码如下:

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()方法加合理设置散点大小即可,代码如下:

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.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 图例设置的定制化设定,也适用于其他图例。绘图完整代码如下:

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 包进行解决,这里给出文本添加的代码,其他步骤一样:

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

本文分享自微信公众号 - DataCharm(shujumeili) ,作者:宁海涛

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间: 2020-11-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

版权声明
本文为[DataCharm]所创,转载请带上原文链接,感谢
https://cloud.tencent.com/developer/article/1790258

  1. Python 3 entry, see this is enough
  2. 华为大佬打造的400集Python视频学起来,学完万物皆可爬
  3. 400 episodes of Python video created by Huawei boss
  4. django之csrf_exempt解决跨域请求的问题
  5. CSRF of Django_ Exempt solves the problem of cross domain requests
  6. 1.7 万 Star!一个简单实用的 Python 进度条库
  7. 17000 stars! A simple and practical Python progress bar library
  8. Python爬虫:设置Cookie解决网站拦截并爬取蚂蚁短租
  9. Python crawler: setting cookie to solve website interception and crawling ant short rent
  10. Python-Net编程
  11. Python net programming
  12. 学习Python数学英语基础重要吗?Python教程!
  13. Is it important to learn the basics of math and English in Python!
  14. Python数据分析常用库有哪些?Python学习!
  15. What are the common libraries for Python data analysis? Learn Python!
  16. win 创建python虚拟环境
  17. Creating Python virtual environment with win
  18. In order to automatically collect B station barrage, I developed a tool in Python
  19. 用Python编程语言来实现阿姆斯特朗数的检查
  20. Using python programming language to check Armstrong number
  21. Python中的解决中文字符编码的问题
  22. Solving the problem of Chinese character coding in Python
  23. Translation: practical Python Programming 02_ 01_ Datatypes
  24. Installation and use of Python and tensorflow in win10 environment (Python version 3.6, tensorflow version 1.6)
  25. Python series 46
  26. Linux安装Python3
  27. 【python接口自动化】- 正则用例参数化
  28. Python RestFul Api 设计
  29. filecmp --- 文件及目录的比较│Python标准库
  30. Installing python3 on Linux
  31. [Python] Matplotlib 圖表的繪製和美化技巧
  32. (資料科學學習手札108)Python+Dash快速web應用開發——靜態部件篇(上)
  33. 翻譯:《實用的Python程式設計》02_01_Datatypes
  34. 【python接口自动化】- 正则用例参数化
  35. 翻译:《实用的Python编程》02_02_Containers
  36. 两年Java,去字节跳动写Python和Go
  37. [Python interface automation] - regular use case parameterization
  38. Python restful API design
  39. 翻译:《实用的Python编程》02_02_Containers
  40. 两年Java,去字节跳动写Python和Go
  41. 翻译:《实用的Python编程》02_02_Containers
  42. Python基于粒子群优化的投资组合优化研究
  43. ubuntu部署django项目
  44. 兩年Java,去位元組跳動寫Python和Go
  45. 翻譯:《實用的Python程式設計》02_02_Containers
  46. 这样学习Python,爷爷都学会了!超简单Python入门
  47. [Python] 基于 jieba 的中文分词总结
  48. 【python】递归听了N次也没印象,读完这篇你就懂了
  49. [Python] 基于 jieba 的中文分词总结
  50. 人理解迭代,神则体会递归,从电影艺术到Python代码实现神的逆向思维模式
  51. [Python] 基於 jieba 的中文分詞總結
  52. Python属于后端开发还是前端开发?Python入门!
  53. 【python】递归听了N次也没印象,读完这篇你就懂了
  54. 一天快速入门python
  55. 学习Python对年龄有没有要求?30岁可以吗?
  56. 清华教授!12小时整理的最全Python教程(文末无偿分享)
  57. Filecmp -- comparison of files and directories
  58. Drawing and beautifying skills of [Python] Matplotlib chart
  59. Python + dash rapid web application development static components
  60. Translation: practical Python Programming 02_ 01_ Datatypes