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

线条,标记,文本等大多数元素都有以磅为单位的大小。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()
  1. 删除matplotlib的缓冲目录(rm -rf 上面python环境中查询到的缓冲地址)

  2. 修改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))
a 原始图片
b 移动脊柱后

给点加注释

使用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的理解


  1. matplotlib 设置图形大小时 figsize 与 dpi 的关系 ↩︎

  2. python Font family [‘sans-serif‘] not found.Falling back to DejaVu Sans.解决办法(亲测有效) ↩︎

  3. 服务器 Font family [‘sans-serif‘] not found.Falling back to DejaVu Sans.解决办法 ↩︎

  4. Matplotlib 教程 | 菜鸟教程 ↩︎ ↩︎

  5. python用matplotlib绘图,如何删除重复冗余图例 ↩︎ ↩︎

  6. plt.subplots()的使用 ↩︎

  7. matplotlib绘图基本操作&美化教程 ↩︎

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值