热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

r语言和python可视化绘图_用Python来仿制一张R语言的数据可视化图

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。以下文章来源于Python大数据分析,作者费弗里简介开门见山&#x

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

以下文章来源于Python大数据分析 ,作者费弗里

简介

开门见山,今天我们要模仿的数据可视化作品来自 「#TidyTuesday」 活动于2020年1月28日发布的「旧金山街道树木数据集」下的众多参赛作品中,由Philippe Massicotte创作的(如图1所示)非常受欢迎的 「Street trees of San Francisco」:

图1

原作者使用的工具是R语言,而今天的文章内容,我就将带大家学习如何在Python中模仿图1的风格进行类似数据信息的可视化展示(其实原作品有一些令人困惑的瑕疵,因此我在下文中在一些地方采用了与原作者不同的分析方式,因此最终的成品与原作品有一些不同之处)。

模仿过程

今天我们要模仿的这张图,咋一看上去似乎略复杂,但如果你曾经阅读过我的「基于geopandas的空间数据分析」系列文章,就一下子可以在脑中将此图构成进行分解:

过程分解

我们仔细观察原作品,可以get到其主要视觉元素是将统计出的数值映射到每个社区面色彩之上,且外围的轮廓描边,很明显是整个地区对应整体的向外缓冲区,再辅以道路网,使得整张图看起来显得很“精密”。

结合我们手头的数据:旧金山社区「面」数据、有登记的街道树木「点」数据,至于道路网「线」数据我们则可以利用第三方库osmnx进行获取(建议利用conda install -c conda-forge osmnx进行安装)。

将过程拆分为下列步骤:

「数据准备」

首先我们需要读入已有的数据并进行相应的矢量化:

而路网数据我们则可以利用osmnx进行在线获取,只需传入我们的旧金山面数据bbox范围,配合

osmnx进行获取即可:

接着我们在上述数据基础上对每个社区面内部的街道树木数量进行统计并对数据进行分箱,配上预设区间的色彩值:

#统计每个社区内部的树木数量

sf_trees =\

(

gpd#空间连接

.sjoin(left_df=sf,

right_df=trees,

op='contains',

how='left')#按照name分组计数(这里未连接到任何数的社区被

#记为1本质上是错误的,但我们绘图分段后这一点不影响)

.groupby('name')

.agg({'name': 'count','geometry': 'first'})

.rename(columns={'name': '数量'})

.reset_index(drop=False)#直接转为GeoDataFrame

.pipe(gpd.GeoDataFrame, crs='EPSG:4326')

)

sf_trees['颜色'] =(

pd

.cut(sf_trees['数量'],

bins=[0, 2500, 5000, 7500, 10000, max(sf_trees['数量'])],

labels=['#e4f1e1', '#c0dfd1', '#67a9a2', '#3b8383', '#145e64'])

)

最后别忘记了我们作为轮廓的缓冲区生成:

#生成轮廓缓冲区

sf_bounds = gpd.GeoSeries([sf.buffer(0.001).unary_union], crs='EPSG:4326')

「主要视觉元素绘制」

做好这些准备后我们直接就可以先将图像的主体元素绘制出来:

importmatplotlib.pyplot as pltfrom matplotlib importfont_manager as fm#设置全局默认字体

plt.rcParams['font.sans-serif'] = ['Times New Roman']

fig, ax= plt.subplots(figsize=(6, 6))#设置背景色

ax.set_facecolor('#333333')

fig.set_facecolor('#333333')#图层1:缓冲区轮廓

ax =(

sf_bounds

.plot(ax=ax, facecolor='none', edgecolor='#cccccc', linewidth=1)

)#图层2:带有树木统计信息的社区面

ax =(

sf_trees

.plot(color=sf_trees['颜色'], edgecolor='#333333',

linewidth=0.5, ax=ax)

)#图层3:osm路网

ax =(

roads

.plot(linewidth=0.05, edgecolor='#3c3d3d',

ax=ax)

)#设置x轴

ax.set_xticks([-122.5, -122.45, -122.4, -122.35])

ax.set_xticklabels(['122.5°W', '122.45°W', '122.4°W', '122.35°W'])#设置y轴

ax.set_yticks([37.72, 37.74, 37.76, 37.78, 37.8, 37.82])

ax.set_yticklabels(['37.72°N', '37.74°N', '37.76°N', '37.78°N', '37.8°N', '37.82°N'])#设置坐标轴样式

ax.tick_params(axis='both', labelcolor='#737373', color='none', labelsize=8)#隐藏周围的spines线条

ax.spines['left'].set_color('none')

ax.spines['right'].set_color('none')

ax.spines['top'].set_color('none')

ax.spines['bottom'].set_color('none')#导出图像

fig.savefig('图4.png', dpi=600, bbox_inches='tight')

「辅助视觉元素的添加」

接下来我们只需要补充上各种点睛之笔的小元素即可,其中值得一提的是下方的图例我们用inset_axes()插入子图的方式灵活实现。

并且外部字体文件的使用也是很添彩的,我们这里就分别在「标题」和「刻度标签」处使用到了两种特殊的字体(你可以在开头的Github仓库找到我用到的所有字体文件):

fig, ax = plt.subplots(figsize=(6, 6))#设置背景色

ax.set_facecolor('#333333')

fig.set_facecolor('#333333')#图层1:缓冲区轮廓

ax =(

sf_bounds

.plot(ax=ax, facecolor='none', edgecolor='#cccccc', linewidth=1)

)#图层2:带有树木统计信息的社区面

ax =(

sf_trees

.plot(color=sf_trees['颜色'], edgecolor='#333333',

linewidth=0.5, ax=ax)

)#图层3:osm路网

ax =(

roads

.plot(linewidth=0.05, edgecolor='#3c3d3d',

ax=ax)

)#设置x轴

ax.set_xticks([-122.5, -122.45, -122.4, -122.35])

ax.set_xticklabels(['122.5°W', '122.45°W', '122.4°W', '122.35°W'])#设置y轴

ax.set_yticks([37.72, 37.74, 37.76, 37.78, 37.8, 37.82])

ax.set_yticklabels(['37.72°N', '37.74°N', '37.76°N', '37.78°N', '37.8°N', '37.82°N'])#设置坐标轴样式

ax.tick_params(axis='both', labelcolor='#737373', color='none', labelsize=8)#隐藏周围的spines线条

ax.spines['left'].set_color('none')

ax.spines['right'].set_color('none')

ax.spines['top'].set_color('none')

ax.spines['bottom'].set_color('none')#以插入子图的方式添加下方图例

ax_bar = ax.inset_axes((0.25, -0.12, 0.5, 0.015))

ax_bar.set_facecolor('#333333')

ax_bar.spines['left'].set_color('none')

ax_bar.spines['right'].set_color('none')

ax_bar.spines['top'].set_color('none')

ax_bar.spines['bottom'].set_color('none')

ax_bar.bar(range(5), [1]*5, width=0.975, color=['#e4f1e1', '#c0dfd1', '#67a9a2', '#3b8383', '#145e64'])

ax_bar.set_yticks([])

ax_bar.set_xticks([i+0.5 for i in range(4)])

ax_bar.set_xticklabels(['2500', '5000', '7500', '10000'],

fontdict={'fontproperties': fm.FontProperties(fname="RobotoCondensed-Regular.ttf")})

ax_bar.tick_params(color='none', labelcolor='#ffffff', labelsize=8, pad=0)

ax.set_title('Street trees of San Francisco',

fontsize=24,

color='#ffffff',

pad=40,

fontproperties=fm.FontProperties(fname="Amaranth-Bold.ttf"))

ax.text(0.5, 1.08, '''There are a total of 192987 trees in San Francisco regrouped into 571 species.

The district with the most number of trees is Mission whereas the one with

the least number of trees is LincoLn Park / Ft. Miley.''', transform=ax.transAxes, ma='center',

ha='center', va='top', color='#ffffff')

ax.text(0.5, -0.22, 'Visualization by CNFeffery', fontsize=8,

color='#737373', ha='center', transform=ax.transAxes)#导出图像

fig.savefig('图5.png', dpi=600, bbox_inches='tight')



推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
author-avatar
hro5028136
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有