Matplotlib介绍,基本操作,及美化
Matplotlib介绍
Matplotlib 可能是 Python 2D-绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。这里将会探索 matplotlib 的常见用法。一般使用pyploy而不是pylab,引入如下
import matplotlib.pyplot as plt
设置图形大小时 figsize 与 dpi 的关系1
matplotlib 中设置图形大小的语句如下:
fig = plt.figure(figsize=(a, b), dpi=dpi)
其中:
figsize 设置图形的大小,a 为图形的宽, b 为图形的高,单位为英寸
dpi 为设置图形每英寸的点数
则此时图形的像素为:
px, py = a*dpi, b*dpi # pixels
![](https://i-blog.csdnimg.cn/blog_migrate/5e7b6792742515cea74917246979c863.png#pic_center)
线条,标记,文本等大多数元素都有以磅为单位的大小。Matplotlib 中 每英寸点数(ppi)为72,则宽度为 1 点的线将为 1/72 英寸宽,使用 fontsize 12 点的文本将是 12/72 寸高。(1英寸等于2.54厘米)
dpi 确定了图形每英寸包含的像素数,图形尺寸相同的情况下, dpi 越高,则图像的清晰度越高
Linux更换字体23
1.在所需系统中python环境下,输入以下代码查看字体路径
import matplotlib
print(matplotlib.matplotlib_fname())
2. 去mpl-data/fonts/ttf
目录下把下载的ttf文件放过去
3. 查看matplotlib的缓冲目录( 在终端python环境下,输入以下命令,获取缓冲目录)
import matplotlib
matplotlib.get_cachedir()
-
删除matplotlib的缓冲目录(rm -rf 上面python环境中查询到的缓冲地址)
-
修改matplotlibrc文件
font.family : sans-serif
# 去掉前面的#
font.sans-serif : SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
# 去掉前面的#,并在冒号后面添加SimHei
axes.unicode_minus : False
# 去掉前面的#,并将True改为False
Matplotlib基本操作4
点的颜色、标记形状、坐标轴等通用设置
# 导入 matplotlib 的所有内容(nympy 可以用 np 这个名字来使用)
from pylab import *
# 创建一个 8 * 6 点(point)的图,并设置分辨率为 80
figure(figsize=(8,6), dpi=80)
# 创建一个新的 1 * 1 的子图,接下来的图样绘制在其中的第 1 块(也是唯一的一块)
subplot(1,1,1)
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)
# 绘制余弦曲线,使用蓝色的、连续的、宽度为 1 (像素)的线条
plot(X, C, color="blue", linewidth=1.0, linestyle="-")
# 绘制正弦曲线,使用绿色的、连续的、宽度为 1 (像素)的线条
plot(X, S, color="green", linewidth=1.0, linestyle="-")
# 设置横轴的上下限
xlim(-4.0,4.0)
# 设置横轴记号
xticks(np.linspace(-4,4,9,endpoint=True))
# 设置纵轴的上下限
ylim(-1.0,1.0)
# 设置纵轴记号
yticks(np.linspace(-1,1,5,endpoint=True))
# 以分辨率 72 来保存图片
# savefig("exercice_2.png",dpi=72)
# 特殊显示某些横坐标
xticks([0, 16, 32, 48, 64, 80, 96, 112, 128], ("0", "16", "32", "48", "64", "80", "96", "112", "128"), fontsize=12, fontweight='normal')
# 在屏幕上显示
show()
删除重复冗余图例5与修改图例样式
分多次进行plt画图,每次都加label = "xx"
的话,会在画图之后出现重复的图例。解决办法参考链接5,搬运代码。
from collections import OrderedDict
import matplotlib.pyplot as plt
handles, labels = plt.gca().get_legend_handles_labels()
by_label = OrderedDict(zip(labels, handles))
plt.legend(by_label.values(), by_label.keys())
设置图例字体的大小和粗细可以按如下操作进行
leg = plt.gca().get_legend()
ltext = leg.get_texts()
plt.setp(ltext, fontsize=12, fontweight='normal') # 设置图例字体的大小和粗细
plt.subplots()的使用6
下面两种方式有相同的效果
fig = plt.figure()
fig.add_subplt(111)
fig,ax = plt.subplots()
通常在subplots中只使用ax
,如ax.plot,ax.bar
等,如果多个子图如fig,ax = plt.subplots(nrows=2, ncols=2)
,则使用ax[0,0],ax[0,1],ax[1,0],ax[1,1]
来控制子图。也可以使用axes = ax.flatten()
,变为一维使用axes[0], axes[1]
等来控制子图
填充,画直线
画垂直线
matplotlib.pyplot.axvline(x=0, ymin=0, ymax=1, **kwargs)
"""
参数:
x:数据坐标中的x位置以放置垂直线
ymin:y轴上的垂直线起始位置,它将取0到1之间的值,0是轴的底部,1是轴的顶部
ymax:y轴上的垂直线结束位置,它将取0到1之间的值,0是轴的底部,1是轴的顶部
**kwargs:其他可选参数可更改线的属性,例如
改变颜色,线宽等
"""
填充一块区域进行上色
matplotlib库的axiss模块中的Axes.fill_betweenx()函数用于填充两条垂直曲线之间的区域。
fig, ax = plt.subplots()
ax.fill_betweenx(self, y, x1, x2=0, where=None, step=None, interpolate=False, *, data=None, **kwargs)
"""
参数:此方法接受以下描述的参数:
y:该参数包含用于定义曲线的数据点的y坐标。
x1:此参数包含用于定义第一条曲线的数据点的x坐标
x2:该参数包含用于定义第二条曲线的数据点的x坐标。它是可选的,默认值为0。
where:此参数是可选参数。它用于排除某些水平区域的填充。
interpolate:此参数也是可选参数。它是错误栏行的线宽,默认值为NONE。
step:此参数也是可选参数。它用于定义填充是否应为阶跃函数。
"""
Matplotlib美化
控制坐标刻度间隔
刻度间隔设置,并存在变量里
from matplotlib.pyplot import MultipleLocator
fig, ax = plt.subplots()
ax.xaxis.set_major_locator(MultipleLocator(1)) # 设置x坐标的间隔
更换配色
导入pip install brewer2mpl
,具体的详细使用和配色可以看matplotlib绘图基本操作&美化教程7。
去掉边框,移动脊柱4
坐标轴线和上面的记号连在一起就形成了脊柱(Spines,一条线段上有一系列的凸起,是不是很像脊柱骨啊~),它记录了数据区域的范围。它们可以放在任意位置,不过至今为止,我们都把它放在图的四边。
实际上每幅图有四条脊柱(上下左右),为了将脊柱放在图的中间,我们必须将其中的两条(上和右)设置为无色,然后调整剩下的两条到合适的位置——数据空间的 0 点。
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom') # 设置坐标轴上的数字显示的位置,top:显示在顶部 bottom:显示在底部,默认是none
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
![]() |
![]() |
给点加注释
使用annotate
进行点的标注. 直接参考这篇文章:python 如何用matplotlib给一些点加注释
加入子图
step=.1
x=np.arange(0,10+step,step)
y=x**3
fig,ax=plt.subplots(figsize=(12,6))
ax.plot(x,y)
axins=ax.inset_axes([0.1,0.5,0.4,0.4])
axins.plot(x[:10],y[:10])
ax.indicate_inset_zoom(axins,linewidth=3)
axins.set_xticklabels('')
axins.set_xticklabels('')
plt.show()
附加:关于plt.legend()中bbox_to_anchor的理解