Python逐步打造惊艳的折线图

大家好,Matplotlib可以快速轻松地使用现成的函数绘制图表,但是微调步骤需要花费更多精力。今天本文将介绍如何使用Matplotlib绘制吸引人的图表,实现折线图的惊艳变身。

1.数据

为了说明方法,本文使用了包含过去50年各国GDP信息的公开数据集:

来源:世界银行国民账户数据和OECD(经济合作与发展组织)国民账户数据文件。

许可证URL:https://datacatalog.worldbank.org/public-licenses#cc-by

导入必要的软件包、读取数据、绘制图表,对2022年的GDP前20个国家进行筛选:

import pandas as pd
import matplotlib.pyplot as plt
from datetime import timedelta# 读取数据
df = pd.read_csv('88a1e584-0a94-4e73-b650-749332831ef4_Data.csv', sep=',')
df.drop(['Series Name', 'Series Code', 'Country Code'], axis=1, inplace=True)
df = df.dropna(subset=['Country Name'])# 对 2022 年最富有的 20 个国家进行筛选
top_20_countries = df[df['Year'] == '2022-01-01'].sort_values('GDP', ascending = False).head(20)['Country Name'].tolist()
df = df[df['Country Name'].isin(top_20_countries)].reset_index(drop = True)df.head()

2.基本图

首先,只需四行代码就足以创建图形,并循环遍历各国以绘制它们各自的折线:

# 创建图形和坐标轴对象,指定尺寸和DPI
fig, ax = plt.subplots(figsize=(13.33,7.5), dpi = 96)# 绘制折线
for country in top_20_countries:data = df[df['Country Name'] == country]line = ax.plot(data['Year'], data['GDP'], label=country)

图片

最基本的Matplotlib折线图

3.基本要素

接下来向图表中添加一些关键内容,使其更易于观众阅读。

  • 网格

为了提高图表的可读性,网格是必不可少的。将网格的透明度设置为0.5,这样它们就不会对数据点造成太大干扰。

  • X轴和Y轴重新格式化

为了更全面地了解微调的可能性,本文故意添加了更多的参数。X轴不需要major_formatter 和major_locator对象,因为本文只显示年份,但如果读者的X轴包含其他数字,这就会派上用场。

  • 图例

由于要显示很多条线,因此添加标签和图例非常重要,这样读者就能知道哪条线是哪条线。

# 添加图例
ax.legend(loc="best", fontsize=8)# 创建网格
ax.grid(which="major", axis='x', color='#DAD8D7', alpha=0.5, zorder=1)
ax.grid(which="major", axis='y', color='#DAD8D7', alpha=0.5, zorder=1)# 重新格式化x轴标签和刻度线标签
ax.set_xlabel('', fontsize=12, labelpad=10) # 不需要轴标签
ax.xaxis.set_label_position("bottom")
#ax.xaxis.set_major_formatter(lambda s, i : f'{s:,.0f}') #以防万一我们需要额外的格式设置
#ax.xaxis.set_major_locator(MaxNLocator(integer=True)) #以防我们需要额外的格式化
ax.xaxis.set_tick_params(pad=2, labelbottom=True, bottom=True, labelsize=12, labelrotation=0)# 重新格式化y轴
ax.set_ylabel('GDP (Billions USD)', fontsize=12, labelpad=10)
ax.yaxis.set_label_position("left")
ax.yaxis.set_major_formatter(lambda s, i : f'{s*10**-9:,.0f}')
#ax.yaxis.set_major_locator(MaxNLocator(integer=True)) #以防我们需要额外的格式化
ax.yaxis.set_tick_params(pad=2, labeltop=False, labelbottom=True, bottom=False, labelsize=12)

图片

为本文的图表添加一些必要的功能

4.突出重点

接下来,突出显示最富有的五个国家,并跟踪其GDP随时间的变化。在字典中定义了特定的颜色和线条样式,并对代码稍作修改,以单独绘制它们。

# 颜色和线条样式
colors_dict = {'United States': '#014f86', 'China': '#DC0000', 'Japan': '#ff4d6d', 'Germany': '#403d39', 'India': '#6a994e'}
line_styles_dict = {'United States': '-', 'China': '-', 'Japan': '-', 'Germany': '-', 'India': '-'}# 绘制前5条线
for country in top_20_countries[:5]:color = colors_dict.get(country, 'grey')  # 从字典中获取颜色,如果找不到,默认为灰色line_style = line_styles_dict.get(country, '-')  # 从字典中获取线条样式,如果未找到,默认为实线data = df[df['Country Name'] == country]line = ax.plot(data['Year'], data['GDP'], color=color, linestyle=line_style, zorder=2, label=country)# 添加图例
ax.legend(loc="best", fontsize=8)# 绘制剩余部分
for country in top_20_countries[5:]:data = df[df['Country Name'] == country]line = ax.plot(data['Year'], data['GDP'], color='grey', linestyle=':', linewidth=0.5, zorder=2)

图片

5.修改外观

为本文的图表添加一些功能,可以使其看起来更加专业。它们将位于所有图表的顶部,并且与本文中使用的数据无关。

通过下面的代码片段,这些调整将很容易实现。读者可以根据自己的需求对其进行调整,以创建自己的视觉风格。

  • 边框

边框是图表周围可见的框。除了左边的边框会设置得稍微粗一些外,其余的边框都将被移除。

  • 顶部的红线和矩形

在标题上方添加一条红线和一个矩形,以便将图表与上方的文本很好地隔离开来。

  • 标题和副标题

添加标题来介绍图表,副标题可以用来进一步解释内容,甚至呈现初步的结论。

  • 来源

在所有制作的图表中都必不可少的一项。

  • 调整边距

调整图表区域周围的边距,以确保充分利用所有可用空间。

  • 设置白色背景

将背景设置为白色(默认为透明)在通过电子邮件、Teams或任何其他工具发送图表时非常有用,因为透明背景可能会造成问题。

# 移除边框
ax.spines[['top','right','bottom']].set_visible(False)# 加粗左侧边框
ax.spines['left'].set_linewidth(1.1)# 在顶部添加红线和矩形
ax.plot([0.05, .9], [.98, .98], transform=fig.transFigure, clip_on=False, color='#E3120B', linewidth=.6)
ax.add_patch(plt.Rectangle((0.05,.98), 0.04, -0.02, facecolor='#E3120B', transform=fig.transFigure, clip_on=False, linewidth = 0))# 添加标题和副标题
ax.text(x=0.05, y=.93, s="Evolution of the 20 Richest Countries GDP over the Past 50 Years", transform=fig.transFigure, ha='left', fontsize=14, weight='bold', alpha=.8)
ax.text(x=0.05, y=.90, s="Focus on the current 5 richest countries from 1973 to 2022", transform=fig.transFigure, ha='left', fontsize=12, alpha=.8)# 设置来源文本
ax.text(x=0.05, y=0.12, s="Source: World Bank - https://databank.worldbank.org/", transform=fig.transFigure, ha='left', fontsize=10, alpha=.7)# 调整绘图区域周围的边距
plt.subplots_adjust(left=None, bottom=0.2, right=None, top=0.85, wspace=None, hspace=None)# 设置白色背景
fig.patch.set_facecolor('white')

图片

6.点睛之笔

为了得到在文章开头介绍的最终结果,剩下要做的就是实现这几个额外的组件:

  • 终点标记

这些元素纯粹是为了美观,但能为本文的折线图增添一份亮点。用标记突出显示每条折线的最后一个点,使其更加醒目。

  • 注释

借助annotate方法,可以突出显示图表中的特定点,并在其上直接添加注释。

# 绘制前5条线
for country in top_20_countries[:5]:color = colors_dict.get(country, 'grey')  # 从字典中获取颜色,如果找不到,默认为黑色line_style = line_styles_dict.get(country, '-')  # 从字典中获取线条样式,如果找不到,默认为实线data = df[df['Country Name'] == country]line = ax.plot(data['Year'], data['GDP'], color=color, linestyle=line_style, zorder=2, label = country)ax.plot(data['Year'].iloc[-1], data['GDP'].iloc[-1], 'o', color=color, markersize=10, alpha=0.3)ax.plot(data['Year'].iloc[-1], data['GDP'].iloc[-1], 'o', color=color, markersize=5)# 在图表上添加一些文字
ax.annotate('During the 2000s,\nChina began experiencing rapid economic growth,\noutpacing all other countries.',(data['Year'].iloc[-18], 2000000000000),xytext=(data['Year'].iloc[-28]-timedelta(days=500), 18000000000000),ha='left', fontsize=9, arrowprops=dict(arrowstyle='-|>', facecolor='k', connectionstyle="arc3,rad=-0.15"))

图片

最终成果:这个折线图清晰易读 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/191978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT 中 QTimer 类 备查

基础 // 指定了父对象, 创建的堆内存可以自动析构 QTimer::QTimer(QObject *parent nullptr);// 根据指定的时间间隔启动或者重启定时器, 需要调用 setInterval() 设置时间间隔 void QTimer::start();// 启动或重新启动定时器,超时间隔为msec毫秒。 void QTimer::…

韩语语法中에和로/으로区别,柯桥发音入门韩语培训学校

에和로/으로在行动的去向与到达或涉及的地点一致时,二者可以互换。 但是에表示到达或涉及的具体地点,而로/으로表示的时动作指向的方向或经过的地点。 在只表示去向而不表示具体地点时,只能用로/으로,而在只表示具体地点而不表示方…

2023.12.2 做一个后台管理网页(左侧边栏实现手风琴和隐藏/出现效果)

2023.12.2 做一个后台管理网页(左侧边栏实现手风琴和隐藏/出现效果) 网页源码见附件,比较简单,之前用很多种方法实现过该效果,这次的效果相对更好。 实现功能: (1)实现左侧边栏的手…

摩根士丹利:人工智能推动增长

摩根士丹利(NYSE:MS)将人工智能战略整合到其财富管理业务中,标志着竞争性金融格局迈出了变革性的一步。该公司的人工智能计划,包括与 OpenAI 合作开发人工智能聊天机器人,促进了其财富部门的显着增长。值得…

【数据库】数据库基于封锁机制的调度器,使冲突可串行化,保障事务和调度一致性

封锁使可串行化 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更…

Linux查看计算机处理器相关的信息

采用命令lscpu。部分结果如下:

MicroPython标准库

MicroPython标准库 arraybinascii(二进制/ASCII转换)builtins – 内置函数和异常cmath – 复数的数学函数collections – 集合和容器类型errno – 系统错误代码gc – 控制垃圾收集器hashlib – 散列算法heapq – 堆队列算法io – 输入/输出流json – JSON 编码和解码math – 数…

详解Spring中BeanPostProcessor在Spring工厂和Aop发挥的作用

😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…

【开源】基于Vue+SpringBoot的音乐平台

项目编号: S 055 ,文末获取源码。 \color{red}{项目编号:S055,文末获取源码。} 项目编号:S055,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首…

Vue安装及环境配置详细教程

一、下载node.js 访问node.js官网:Download | Node.js 选择Windows Installer (.msi)的64-bit进行下载。 在E盘新建一个文件夹,取名为nodejs,也可以在其他盘符新建。 在安装node.js时,点击Change...,进行切换盘符安…

使用 STM32 微控制器读取光电传感器数据的实现方法

本文介绍了如何使用 STM32 微控制器读取光电传感器数据的实现方法。通过配置和使用STM32的GPIO和ADC功能,可以实时读取光电传感器的模拟信号并进行数字化处理。本文将介绍硬件连接和配置,以及示例代码,帮助开发者完成光电传感器数据的读取。 …

<JavaEE> 什么是线程安全?产生线程不安全的原因和处理方式

目录 一、线程安全的概念 二、线程不安全经典示例 三、线程不安全的原因和处理方式 3.1 线程的随机调度和抢占式执行 3.2 修改共享数据 3.3 关键代码或指令不是“原子”的 3.4 内存可见性和指令重排序 四、Java标准库自带的线程安全类 一、线程安全的概念 线程安全是指…

无人机助力电力设备螺母缺销智能检测识别,python基于YOLOv7开发构建电力设备螺母缺销小目标检测识别系统

传统作业场景下电力设备的运维和维护都是人工来完成的,随着现代技术科技手段的不断发展,基于无人机航拍飞行的自动智能化电力设备问题检测成为了一种可行的手段,本文的核心内容就是基于YOLOv7来开发构建电力设备螺母缺销检测识别系统&#xf…

spark的安装与使用:一键自动安装

使用shell脚本一键下载、安装、配置spark(单机版) 1. 把下面的脚本复制保存为/tmp/install_spark.sh文件 #!/bin/bash# sprak安装版本 sprak_version"2.4.0" # sprak安装目录 sprak_installDir"/opt/module" # hadoop安装路径&…

【数组和函数实战: 斗地主游戏】

目录 1. 玩法说明 2. 分析和设计 3. 代码实现 4. 游戏演示1. 玩法说明 一副54张牌,3最小,两个王最大,其实是2,和上面一样从大到小排列 2. 分析和设计 2.1 分析和设计 常量和变量设计 一副牌有54张,有牌的数值和花色,可以分别用两个数组来存储,card为卡牌表示的数值,color为…

Java数据结构之《希尔排序》题目

一、前言: 这是怀化学院的:Java数据结构中的一道难度中等的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完…

CGAL的四叉树、八叉树、正交树

四叉树(Quadtree):四叉树是一种用于二维空间分割的数据结构。它将一个二维区域划分为四个象限,每个象限进一步细分为四个小块,以此类推。四叉树可以用于空间索引、图形学、地理信息系统(GIS)等领…

前端打包添加前缀

vue2添加前缀 router的base加上前缀 export default new Router({mode: history, // 去掉url中的#base: privateDeployUrl, // 这里加上前缀scrollBehavior: () > ({y: 0}),routes: constantRoutes })vue.config.js,publicPath属性加上前缀 publicPath: proces…

Kali 修改IP地址和DNS 开启SSH和远程桌面

一、修和IP和DNS 1、打开配置文件 vim /etc/network/interfaces# 加入 auto eth0 iface eth0 inet static address 10.3.0.231 netmask 255.255.255.0 gateway 10.3.0.12、清空网卡配置 ip addr flush dev eth0 3、配置DNS vim /etc/resolv.confnameserver 114.114.114.11…

爬虫-xpath篇

1.xpath的基础语法 表达式描述nodename选中该元素/从根节点选取、或者是元素和元素间的过渡//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置.选取当前节点…选取当前节点的父节点选取属性text()选取文本 举例: 路径表达式结果html选择html元…