matplotlib基础教程
matplotlib是python中最常用的绘图包,其他很多包(如seaborn)都是对它的更高层次的抽象实现。
它是个超大包,涉及很多概念,但有些晦涩难懂,画起图来,常常做不到得心应手。
本教程旨在:对matplotlib庖丁解牛,介绍它的各个组件,以后遇到问题,知道问题归属,知道怎么查看帮助文档。
一、hello world
每个语言都有自己的起手式:hello world,但matplotlib的起手式并不简单,主要是有N种,常令我之小白选择困难症发作。
**起手式–第一式 **(这个全天下都一样,无脑用即可):
import matplotlib.pyplot as plt # 导入绘图模块
起手式–第二式(一):
# 什么鬼,没代码?不用起手?
# 是的,第一种方法不用起手,直接进入下一式:
# 如:
# 画线式:plot.plot()
# 散点式:plot.scatter()
# 柱状式:plot.bar()
# ...
起手式–第二式 (二):
fig = plt.figure()
ax = fig.add_subplot(111)
起手式–第二式 (三):
fig, ax = plt.subplots()
这么多起手式,该怎么选择呢,大家无脑记住使用第三种方法就行,不要问为什么,记住就行。现在总结以下matplotlib的起手式:
import matplotlib.pyplot as plt # 导入绘图模块
fig, ax = plt.subplots()
那么fig和ax是什么呢,下一节我们就来讲讲。
二、图片的组成部分
这节我们的任务就是拆解下面这张图:
先介绍下这里面涉及到的一些基本概念:
-
figure:画布,画画的纸
-
axes:画图区。
这个是啥意思,为什么画图区不是整张画布(figure)?
请看下面第一张图,红色框内的区域就是figure,也就是我们的画纸,黑色框内的区域就是axes,也就是我们的作图区。figure和axes之间的区域就叫留白(这词用的不准确,明白意思即可):主要是为了在将图片裱起来时不遮挡内容。
一个figure可以包含多个axes,如第二张图。
-
axis:坐标轴
它有几个部分组成:
spines:脊柱线。 一个axes默认共有4个spine,分别通过ax.spines["left"]
,
ax.spines["bottom"]
, ax.spines["right"]
, ax.spines["top"]
获得。
ticks: 刻度线。 通过ax.get_ticks()
获得,ax.set_ticks()
设置。
ticklabels: 刻度标签。 通过ax.get_ticklabels()
获得,ax.set_ticklabels()
设置。
-
title: 图片标题。 通过
ax.set_title()
设置。 -
x/y label:X轴/Y轴的标题。 通过
ax.set_xlabel()
、ax.set_ylabel()
设置。
下面来操作一波:
-
起手式:
import matplotlib.pyplot as plt fig, ax = plt.subplots()
fig就是figure, ax就是axes
-
spines操作:
# 隐藏上边的spine ax.spines["top"].set_visible(False) # 隐藏右边的spine ax.spines["right"].set_visible(False) # 将下边的spine设置成红色 ax.spines["bottom"].set_color("red") # 将下边的spine加粗 ax.spines["bottom"].set_linewidth(3)
-
ticks操作:
# 分别在x轴的 0,0.1,...,0.9,1 处设置刻度线 ax.set_xticks([0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]) # 在y轴的 0.1,0.3, 0.5, 0.7, 0.9 处设置副刻度线 ax.set_yticks([0.1,0.3,0.5,0.7,0.9], minor=True) # 将X轴的ticks加粗加长,并设置成蓝色 ax.get_xaxis().set_tick_params(size=5, width=3, color="blue")
-
ticklabes操作:
# 将x轴的刻度标签改为A_0, A_1, ... , A_10, 颜色改为蓝色, 并旋转90度 ax.set_xticklabels(["A_"+str(i) for i in range(12)], color="blue", rotation=90) # 将第3个刻度标签加粗 xticklabels_list = ax.get_xticklabels() xticklabels_list[2].set_fontweight("bold")
-
title, xlabel, ylabel操作
# 将图片标题设置为"Axes" ax.set_title("Axes") # 将Y轴标题设置为“Xlabel”, 颜色:绿色,底色:黄色 ax.set_xlabel("Ylabel", color="green", backgroundcolor="yellow")
-
欣赏作品
# 交互式界面, 如ipython fig.show() # 非交互界面 fig.savefig("my_first_figure.png")
上面介绍的都是些基本招式,不会不行,但只学这些肯定不够用,招式无穷无尽,死记硬背反而落了下成,下面我将传授本门内功心法。
-
首先得准备一件趁手兵器 – ipython。
-
借助ipython,获得对象的所有方法或属性
# 查看figure对象的所有方法属性 fig.*? # 查看axes对象中包含"get_"字符串的方法属性 ax.*get_*? # 查看xticklabel对象的所有方法属性 xtl = ax.get_xticklabels()[0] xtl.*?
-
查看某方法的具体帮助文档
# 查看ax.plot()的帮助文档 ax.plot? # **kwargs具体参数查询,举个例子,查询ax.set_title()都有哪些参数? # 如下查询,只能看到几个参数: label, fontdict, loc, pad, **kwargs ax.set_title? # 那**kwargs中到底有哪些参数呢?仔细看**kwargs的描述: # **kwargs : `~matplotlib.text.Text` properties # Other keyword arguments are text properties, see # :class:`~matplotlib.text.Text` for a list of valid text # properties. # 所以,**kwargs的具体参数要从Text类中找 matplotlib.text.Text?
-
官网查询
# 除了在ipython中查询外,也可以在官网查询,同样方便 https://matplotlib.org/stable/py-modindex.html
掌握了以上方法,matplotlib几乎就没有什么神秘之处了。
武功秘籍
这节不太想讲,只要掌握了本门的内功心法,各秘籍一看就通,如:
- 线图:ax.plot()
- 散点图:ax.scatter()
- 柱状图:ax.bar()
- 饼图:ax.pie()
- 直方图:ax.hist()
- …
本门具体有多少秘籍,本人也不知,道友可自行去藏书阁一观。藏书阁传送门
当然,演武场还有教习,道友可以先看看效果威力,再决定跟谁学,学什么。演武场传送门