提起图表,你一定会想到 Excel 和 PPT 中的条形图、饼状图、柱状图,除此之外,还有很多其他种类的图表,比如折线图、热力图等等。但是,不管你通过哪一种图表,它们都是为了让你能够更直观、更简洁地表达自己的想法,也能让我们更好地从一堆杂乱无章的数字中找出规律。
虽然图表比直接展示数据多了这么多优势,但是也存在一个问题,那就是使用 Excel 制作一张精美的图表,需要消耗大量的时间。而且这些精美的图表,如果因为临时需要再加载新的数据,又要重复花费时间来制作。
别担心,这些问题都可以通过 Python 中的 seaborn 或者 echarts 库来解决。
使用 seaborn
今天,我们用 seaborn 来实现这样一种图表,抛砖引玉,带你认识 seaborn 的强大:
先看一组数据:
代码语言:javascript复制
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
.. ... ... ... ... ...
145 6.7 3.0 5.2 2.3 virginica
146 6.3 2.5 5.0 1.9 virginica
147 6.5 3.0 5.2 2.0 virginica
148 6.2 3.4 5.4 2.3 virginica
149 5.9 3.0 5.1 1.8 virginica
为你解释一下示例数据。它是由五列组成的,分别表示鸢尾花的花萼长度、宽度,鸢尾花的花瓣长度、宽度(你可以通过百度来搜索鸢尾花的图片,来了解什么是花萼的长宽,什么是花瓣的长宽),以及三种鸢尾花品种(setosa 山鸢尾,versicolor 杂色鸢尾,virginica 维吉尼亚鸢尾)。
通过散点图的方式采用不同维度展示花的特性,让你能根据颜色把三种花区分出来,我们来看一下代码:
代码语言:javascript复制
import seaborn as sns
import ssl
import matplotlib.pyplot as plt
ssl._create_default_https_context = ssl._create_unverified_context # 不校验ssl
# 设置背景
sns.set(style="darkgrid", color_codes=True)
# 使用示例数据
iris = sns.load_dataset('iris',data_home='seaborn-data',cache=True)
# 加载数据,使用散点图,设置点的颜色和样式
sns.pairplot(iris,
kind = 'scatter', #散点图
diag_kind = 'hist', #直方图
hue = 'species', #按照某一字段进行分类
palette = 'husl', #设置调色板
markers = ['o', 's', 'D'], #设置不同系列的点样式
height = 2 #图标大小
)
plt.show()
代码的逻辑:
第一部分,sns.load_dataset 加载数据源,数据源可以由二维元组组成类似 Excel 一样的多行多列的数据,数据中的第一行和第一列会作为标题,被 seaborn 自动处理。我在代码中使用了示例数据“鸢尾花分类”来为你展示数据的加载。
第二部分,sns.pairplot 是指定图表类型,它是由“kind = 'scatter'”参数指定的。因为 pairplot() 函数支持散点图和回归图 (kind='reg'),我们需要关注分布情况,所以使用了散点图的方式来展示数据。
第三部分是点的样式。绘制的散点图中的每个点,也可以单独设置它们的样式。例如我指定了每个点的大小“height=2”,以及指定了色彩样式“palette='husl'”,并为每个列指定不同的颜色“hue = 'species'”。
最后一步是绘制图形,由于 seaborn 基于 matplotlib 实现图形,因此需要使用 plt.show() 函数进行图形的绘制,那么鸢尾花数据的散点图绘制结果如下:
在截图中,基于花的四个属性,我采用了不同的维度进行绘图。同时你会发现,在某一维度下,其中一种颜色和其他颜色有明显的分界,非常容易把其中一种和另外两种花区分开。通过观察散点图,你会得到这样一个结论,使用合理的图形,能够帮你更好地解释某个晦涩难懂的概念,也能更容易从数据中发现规律。
如何选择合适的图表
由于 seaborn 支持的图表非常丰富,我们也不可能会逐个尝试。学会根据图表的应用场景来选择适合的种类,再通过适合的种类再细化到图表的具体样式就可以了。
具体来说有可以通过参考图例和参考分类来选择合适的图表。
第一种解决办法是参考图例,在 seaborn 的官方文档中,列举了各种图例,它的地址和截图如下:
第二种解决办法是参考分类,这时候,你就要根据你的业务场景,分析出它都对应了以下四个分类中的哪一类,再按照分类通过官方文档 API 页面找到具体的图表函数。四个分类如下:
- 关系类,用于展示数据集中多个变量之间的关系,relplot()、scatterplot()、lineplot() 都属于关系类。
- 分布类,用于展示数据集中多个变量的分布情况,displot()、kdeplot() 是这一类经常使用的图表类型。
- 线性关系类,是把多个变量联系起来,观察每个采样的线性变化趋势。regplot() 和 lmplot() 经常用于表示线性关系。
- 结构化多图,用于把多种方式的分析数据放在一起进行展示。例如我们分析鸢尾花就使用了散点图 柱状图的方式,但是散点图更能体现出它的各种属性之间的关系。
使用 echarts
pyecharts 是 Python 和 Echarts 的结合体,Echarts 是由百度开源的交互式可视化图表工具,基于 JavaScript 脚本实现。
pyecharts 的数据格式,要基于不同的图形类型,使用不同的格式。但是一般情况下,是多行多列组成的类似 Excel 表格的格式,这种格式在 Python 中一般使用嵌套元组的形式进行保存。
和我们学习 seaborn 类似,你可以参考图例,也可以参考分类来学习 pyecharts 支持的动态图表。与 seaborn 不同的是,pyecharts 的官方文档没有图例,不过不要忘了,pyecharts 是基于 Echarts 编写的,因此图例可以参考 Echarts 的 官方网站。
那针对老手的图表分类和 API 可以参考 这个地址。以最常用的图表,折线图为例,你可以打开地址,其中会包括图表的完整调用代码、测试数据和图例,通过参考示例可以让你掌握更多类型的图表。
现在,我们来制作一个疫情地图。
由于我们需要绘制中国地图,因此直接使用 pyecharts 库的 Map() 类,它是绘制动态地图的类。它的官方网站链接:https://gallery.pyecharts.org/#/Map/map_base
代码语言:javascript复制
import requests
import json
from pyecharts.charts import Map
from pyecharts import options as opts
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
data = requests.get(url)
alldata = json.loads(data.json()['data'])
chinadata = []
for province in alldata['areaTree'][0]['children']:
provincedata = (
province['name'],
province['total']['nowConfirm']
)
chinadata.append(provincedata)
map_chart = Map()
map_chart.add(
"全国确诊病例分布图",
tuple(chinadata),
"china",
is_map_symbol_show=False
)
map_chart.set_global_opts(
title_opts=opts.TitleOpts(
title=f"全国疫情地图( {alldata['lastUpdateTime']} )"),
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True,
pieces=[
{"min": 1, "max": 9, "label": "1-9人", "color": "#FFE6BE"},
{"min": 10, "max": 99, "label": "10-99人", "color": "#FFB769"},
{"min": 100, "max": 499, "label": "100-499人", "color": "#FF8F66"},
{"min": 500, "max": 999, "label": "500-999人", "color": "#ED514E"},
{"min": 1000, "max": 9999, "label": "1000-9999人", "color": "#CA0D11"},
{"min": 10000, "max": 100000, "label": "10000人以上", "color": "#A52A2A"}
]))
map_chart.render('covid19_map.html')
执行代码后,会在同一路径下生成一个 covid19_map.html
的文件,用浏览器打开后,如下所示:
最后的话
学习一个工具,最重要的不是死记代码细节,而是学会使用官方文档,复制其样例代码,修改后为我所用,实现目标即可。自动化办公领域其实并不需要深入学习编程的细节,会调用各工具 API 就够了。
关注我,每周学习一个 Python 小技巧。