Python数据可视化之香港地图、房价可视化,绘制气泡图

内容摘要
今天的推文教程使用geopandas进行空间图表的绘制(geopandas空间绘图很方便,省去了很多的数据处理过程,而且也完美衔接matplotlib,学习python%20空间绘图的小伙伴可以看下
文章正文

前言

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

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

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

数据读取

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

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

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

数据可视化展示

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

fig,%20ax%20=%20plt.subplots(figsize=(10,8),dpi=200)

hk_map%20=%20hk.geometry.plot(ax=ax,fc="#CCEBEB",ec="#009999",lw=1)
ax.text(.91,0.05,"
Visualization%20by%20DataCharm",transform%20=%20ax.transAxes,
%20%20%20%20%20%20%20%20ha="center",%20va="center",fontsize%20=%208)

ax.axis("off")%20#%20移除坐标轴
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%20loc,%20label%20in%20zip(hk.geometry.representative_point(),hk.name):
%20%20%20%20ax.text(loc.x,loc.y,label,size=13,color="#0DCFE3")

结果如下:

添加气泡散点数据

由于数据的经纬度是直接基于高德地图进行解析的,导致存在部分数据经纬度信息出错,我们使用pandas进行简单的数据筛选,具体就不再展示,后面会推出系列教程推文,数据预览如下:

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

for%20x,y,price%20in%20zip(scatter_se.lon,scatter_se.lat,scatter_se["实用单价"]):
%20%20%20%20hk_map.scatter(x,y,s=price/500,color="#FFEB3B",alpha=.5,ec="k",lw=.1)

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

气泡图例添加

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

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

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

fig,%20ax%20=%20plt.subplots(figsize=(10,8),dpi=200,facecolor="#323332",edgecolor="#323332")
ax.set_facecolor("#323332")
hk_map%20=%20hk.geometry.plot(ax=ax,fc="#292200",ec="gray",lw=1,alpha=.8)

#使用默认的text添加文本导致文本重叠
for%20loc,%20label%20in%20zip(hk.geometry.representative_point(),hk.name):
%20%20%20%20ax.text(loc.x,loc.y,label,size=11,color="#0DCFE3")
for%20x,y,price%20in%20zip(scatter_se.lon,scatter_se.lat,scatter_se["实用单价"]):
%20%20%20%20hk_map.scatter(x,y,s=price/500,color="#FFEB3B",alpha=.5,ec="k",lw=.1)
ax.axis("off")%20#%20移除坐标轴
#这里进行单独的图例添加
ax.scatter([],%20[],%20c="#FFEB3B",%20s=6000/500,
%20%20%20%20%20%20%20%20%20%20%20%20label="6000%20-%2010000",%20edgecolor="black",lw=.5)
ax.scatter([],%20[],%20c="#FFEB3B",%20s=10000/500,
%20%20%20%20%20%20%20%20%20%20%20%20label="10000%20-%2030000",%20edgecolor="black",lw=.5)
ax.scatter([],%20[],%20c="#FFEB3B",%20s=30000/500,
%20%20%20%20%20%20%20%20%20%20%20%20label="30000%20-%2050000",%20edgecolor="black",lw=.5)
ax.scatter([],%20[],%20c="#FFEB3B",%20s=50000/500,
%20%20%20%20%20%20%20%20%20%20%20%20label="50000%20-%2090000",%20edgecolor="black",lw=.5)
#图例定制化设置
legend%20=%20ax.legend(frameon=False,ncol=4,loc="lower%20right",title="实用单价",bbox_to_anchor=(1,%20-.06),
%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fontsize=9)
legend.get_title().set_color("#ffffff")
for%20text%20in%20legend.get_texts():
%20%20%20%20text.set_color("#ffffff")
#添加必要的文本:这里title也是采用相同方法
ax.text(.5,1.05,"香港在售二手房分布图",transform%20=%20ax.transAxes,color="white",weight="bold",size=20,
%20%20%20%20%20%20%20ha="center",%20va="center")
ax.text(.5,.985,"数据来源:菜J学Python",transform%20=%20ax.transAxes,
%20%20%20%20%20%20%20%20ha="center",%20va="center",fontsize%20=%2010,color="white")
ax.text(.91,-.07,"
Visualization%20by%20DataCharm",transform%20=%20ax.transAxes,
%20%20%20%20%20%20%20%20ha="center",%20va="center",fontsize%20=%208,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"},)

可视化结果如下

代码注释
[!--zhushi--]

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!