今天,我们就来了解一下python强大的绘图库——Matplotlib及Seaborn的使用。
首先我们先来了解一下这两个强大的库。
Matplotlib
支持 Python 语言的开源绘图库(可以说是python里最优秀的绘图库了),因为其支持丰富的绘图类型、简单的绘图方式以及完善的接口文档,深受 Python 工程师、科研学者、数据工程师等各类人士的喜欢。
Seaborn
是以 Matplotlib 为核心的高阶绘图库,无需经过复杂的自定义即可绘制出更加漂亮的图形,非常适合用于数据可视化探索。
(两者的联系?区别?)
Matplotlib 应该是基于 Python 语言最优秀的绘图库了,但是它也有一个十分令人头疼的问题,那就是太过于复杂了。3000 多页的官方文档,上千个方法以及数万个参数,属于典型的你可以用它做任何事,但又无从下手。尤其是,当你想通过 Matplotlib 调出非常漂亮的效果时,往往会伤透脑筋,非常麻烦。
Seaborn 基于 Matplotlib 核心库进行了更高阶的 API 封装,可以让你轻松地画出更漂亮的图形。Seaborn 的漂亮主要体现在配色更加舒服、以及图形元素的样式更加细腻。
我们还是要从基础开始说起:
1、首先,导入库:
from matplotlib import pyplot as plt
pyplot模块是 Matplotlib 最核心的模块,几乎所有样式的 2D 图形都是经过该模块绘制出来的。
在这里,将pyplot 缩写成 plt,是约定俗成的方式(大家都是这么用的~)
这里有个要注意的~
在Jupyter Notebook 里使用Matplotlib绘图时,要加上下面这一条代码:
%matplotlib inline
注:
这条命令的作用是将 Matplotlib 绘制的图形嵌入在当前页面中。而在桌面环境中绘图时,不需要添加此命令,而是在全部绘图代码之后追加plt.show( )。
2、画个最简单的折线图:
a=[1,2,3,4,5,6,7,6,5,4,3,2,1]
plt.plot(a)
在这里,我们导入了一个列表,Matplotlib 会默认将该列表作为y值,而x值会从0开始依次递增。而plt.plot( )是pyplot模块下绘制(折线图)的方法类。
一个简单的折线图就绘制出来了~
我们也可以自己定义横坐标:
a_x=[11,12,13,14,15,16,17,18,19,20,21,22,23]
plt.plot(a_x,a)
当然了,这是一个最最简单的例子,在 Matplotlib 中,还有各式各样很有趣的图,大部分图形样式的绘制方法都存在于pyplot模块中,我们只要更改后面的方法类名就可以更改图形的样式啦~
这里是一些常用的图:
柱状图:pyplot.bar
直方图:pyplot.barh
水平直方图:pyplot.broken_barh
等高线图:pyplot.contour
误差线:pyplot.errorbar
柱形图:pyplot.hist
水平柱状图:pyplot.hist2d
饼状图:pyplot.pie
量场图:pyplot.quiver
散点图:pyplot.scatter
我们还是以原来的数据为例,看看其他图的效果:
柱状图:
水平直方图:
我们还可以用plot画一个常见的正弦函数图:
import numpy as np
# 在 -2PI 和 2PI 之间等间距生成 1000 个值,也就是 X 坐标
x = np.linspace(-2*np.pi, 2*np.pi, 1000)
# 计算 y 坐标
y = np.sin(x)
plt.plot(x, y)
注意了~
尽管我们绘制出来的函数很像一条曲线,但实际上,在两点之间依旧是直线。这里看起来像曲线,是因为样本点相互挨得很近(我们取的是1000个点,因此会挨得很近)。
在matplotlib里,我们可以通过设置参数,来达到美化的效果。
下面是在折线图里,一些比较常用的参数:
alpha=
设置线型的透明度,从 0.0 到 1.0
color=
设置线型的颜色
fillstyle=
设置线型的填充样式
linestyle=
设置线型的样式
linewidth=
设置线型的宽度
marker=
设置标记点的样式
想要了解更多参数的小伙伴可以到官网看看哦(包括查看其它图形的)~
https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.pyplot.plot.htmlmatplotlib.org我们还是用原来的正弦函数来试验一下,这次再加上一条余弦函数。
x= np.linspace(-2 * np.pi, 2 * np.pi, 1000)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, color='r', linestyle='--', linewidth=2, alpha=0.7)
plt.plot(x, y2, color='g', linewidth=2)
看上去好像挺不错的样子~
下面我们用饼状图来做个小例子(效果会更明显哦~)
首先我们先简单地绘制一个饼图:
list_pie=[2,4,6,8,10]
plt.pie(list_pie)
下面,我们进行参数设置:
explode = (0, 0, 0.1, 0, 0.2) # 各类别的偏移半径
color = ['b', 'y', 'g', 'r', 'g']
plt.pie(list_pie, colors=color, explode=explode,
shadow=True, autopct='%1.1f%%') #设置阴影,偏移度,颜色
# 饼状图呈正圆
plt.axis('equal')
对比一下,是不是瞬间高大上了~
x=[1,2,3,4,5,6,7]
y1=[3,6,9,12,9,6,3]
y2=[2,9,11,8,6,4,3]
plt.bar(x, y1)
plt.plot(x, y2, '-o', color='r')
在这里,y1是柱状图,y2是折线图。只要将两个图形的代码放置在一起就可以绘制成组合图形了。
注意~
并不是任何的代码放在一起都是组合图。两张图的横坐标必须共享,才能够被 Matplotlib 自动判断为组合图效果~
首先我们来看看这个图:
和我们日常的画架结构一样,在Matplotlib 中,也是有类似“画板”和“画布”的区别的。
figure:相当于绘画用的画板,
axes:相当于铺在画板上的画布。
也就是说,在同一块画板上,我们可以设置不同的画布,用来展示不同的图片。
让我们先来看一个小例子:
x= np.linspace(-2 * np.pi, 2 * np.pi, 1000)
y1 = np.sin(x)
y2 = np.cos(x)
fig = plt.figure() # 新建画板
axes1 = fig.add_axes([0.1, 0.1, 0.9, 0.9]) # 大画布
axes2 = fig.add_axes([0.2, 0.2, 0.3, 0.2]) # 小画布
axes1.plot(x, y1, color='r', linestyle='--', linewidth=2, alpha=0.7) # 大画布
axes2.plot(x, y2, color='g', linewidth=2) # 小画布
可以看到,我们的图形被放在了不同大小的画布上。
那如何控制我们的画布大小及位置呢?
大家可以看下图中add_axes的参数设置:
除此之外也可以看到,add_axes的主要功能,就是向我们设置的画板figure
中添加画布。
当然,还有一种更常见的添加画布的方法,就是——subplots( )。
比如,在subplots(2,2,1 )中,
第一、二个参数代表共创建了2*2个画布,其中subplots(2,2,1 )表示第一个画布。
我们来看看下面这个例子:(注意看subplots的设置哦~)
x= np.linspace(-2 * np.pi, 2 * np.pi, 1000)
y1 = np.sin(x)
y2 = np.cos(x)
plt.subplot(2,1,1)
plt.plot(x, y1, color='r', linestyle='--', linewidth=2, alpha=0.7)
plt.subplot(2,1,2)
plt.plot(x, y2, color='g', linewidth=2)
我们直接从例子出发:
fig, axes = plt.subplots()
plt.rcParams['font.sans-serif']=['SimHei']
axes.set_xlabel('X轴') # 横坐标标题
axes.set_ylabel('Y轴') #纵坐标标题
axes.set_title('三角函数') # 图表标题
x= np.linspace(-2 * np.pi, 2 * np.pi, 1000)
y1 = np.sin(x)
y2 = np.cos(x)
axes.plot(x, y1, color='r', linestyle='--', linewidth=2, alpha=0.7)
axes.plot(x, y2, color='g', linewidth=2)
axes.legend(["sin", "cos"], loc=0) # 图例
set_xlabel:横坐标标题
set_ylabel:纵坐标标题
set_title: 图表标题
loc
:标记图例位置,1,2,3,4
依次代表:右上角、左上角、左下角,右下角;0
代表自适应。
效果图:
在这里我多添加了一条代码:
plt.rcParams['font.sans-serif']=['SimHei']
这是因为我们输出的图例等包含中文,需要对格式进行设置。
然后,也有另一种方式,下面是我以前做的另一个图:
import matplotlib
from matplotlib import pyplot as plt
myfont = matplotlib.font_manager.FontProperties(fname='C:WindowsFontssimsun.ttc')
y_beijing=[8180.900,7659.100,8130.400,7199.500,7818.500,7638.200,7969.500,8225.400,8266.400,8444.600,8103.500,8119.700]
x=range(1,13)
plt.figure(figsize=(8,6),dpi=80,num=4)
plt.plot(x,y_beijing,label='旅客人数月变化',color='yellow')
xtick_labels=['{}月'.format(i) for i in x]
plt.xticks(x,xtick_labels,FontProperties=myfont)
plt.yticks( range(7000,8500,500))
plt.title('北京机场吞吐量',FontProperties=myfont,fontsize=15)
plt.xlabel('月份',FontProperties=myfont,fontsize=15)
plt.ylabel('旅客人数/千人',FontProperties=myfont,fontsize=15)
plt.grid(alpha=0.3)
for x, y in zip(x, y_beijing):
plt.text(x, y+0.4, '%.0f'%y, ha='center', va='bottom', fontsize=10)
plt.legend(prop=myfont)
plt.show()
可以看到,代码有一点点不同,但是仍然达到同样的效果。
其中,myfont=matplotlib.font_manager.FontProperties(fname='C:WindowsFontssimsun.ttc')这条代码也是由于中文输入的原因。
1、通过plt.figure()
或者plt.subplots()
管理一个完整的图形对象。
2、在图形对象的基础上,再添加图表题目、坐标轴标题、以及图例等图表基本内容。
以上便是