• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

python 搞java代码 3年前 (2022-05-21) 27次浏览 已收录 0个评论

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

以下文章来源于DataCharm ,作者宁海涛

 

前言

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

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

 

geopandas geojson数据操作

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

 

数据读取

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

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

www#gaodaima.com来源gaodaima#com搞(代@码网搞代码

 

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

数据可视化展示

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

fig, ax = plt.subplots(figsize=(10,8),dpi=200<span>)

hk_map </span>= hk.geometry.plot(ax=ax,fc=<span>"</span><span>#CCEBEB</span><span>"</span>,ec=<span>"</span><span>#009999</span><span>"</span>,lw=1<span>)
ax.text(.</span>91,0.05,<span>"</span><span>
Visualization by DataCharm</span><span>"</span>,transform =<span> ax.transAxes,
        ha</span>=<span>"</span><span>center</span><span>"</span>, va=<span>"</span><span>center</span><span>"</span>,fontsize = 8<span>)

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

 

结果如下:

 

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

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

<span>for</span> loc, label <span>in</span><span> zip(hk.geometry.representative_point(),hk.name):
    ax.text(loc.x,loc.y,label,size</span>=13,color=<span>"</span><span>#0DCFE3</span><span>"</span>)

 

结果如下:

 

添加气泡散点数据

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

 

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

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

 

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

 

气泡图例添加

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

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

 

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

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

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

ax.axis(</span><span>"</span><span>off</span><span>"</span>) <span>#</span><span> 移除坐标轴</span>

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

plt.savefig(</span><span>"</span><span>hk_charts.png</span><span>"</span>,width=8,height=8<span>,
            dpi</span>=900,bbox_inches=<span>"</span><span>tight</span><span>"</span>,facecolor=<span>"</span><span>#323332</span><span>"</span><span>)
</span><span>#</span><span>ax.set_axisbelow(True)</span>
plt.show()

 

可视化效果:

 

adjustText 库解决文本重叠问题

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

<span>from</span> adjustText <span>import</span><span> adjust_text
</span><span>#</span><span> 使用adjustText修正文字重叠现象</span>
new_texts = [ax.text(loc.x,loc.y,label,size=13,color=<span>"</span><span>#0DCFE3</span><span>"</span>) <span>for</span> loc, label <span>in</span><span> 
             zip(hk.geometry.representative_point(),hk.name)]
adjust_text(new_texts, 
            only_move</span>={<span>"</span><span>text</span><span>"</span>: <span>"</span><span>xy</span><span>"</span>},)

 

可视化结果如下:


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Python数据可视化:香港地图、房价可视化,绘制气泡图

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址