Matplotlib系列之画布与坐标轴设置

通过Matplotlib系列之简述这篇文章,我们已经从宏观上大致了解了Matplotlib图像的组成部分。今天,我们主要介绍画布与坐标轴这两个概念,并详细介绍一下坐标轴属性设置以及脊柱设置。

画布与坐标轴对象

我们可以使用plt.figure()创建一个Figure对象,然后在这个画布对象上进行绘图,因此我们需要再创建一个坐标轴对象,这里可以调用Figure实例的add_axes()方法:

1
2
3
4
import matplotlib.pyplot as plt

fig = plt.figure()
axes = fig.add_axes([0.2,0.2,0.7,0.7])

其中[0.2,0.2,0.7,0.7]表示的是在画布中,坐标轴距离画布左边0.2倍的位置,距离下边0.2倍的位置,然后坐标轴的整体宽度和高度占0.7倍的大小,换句话说,距离右边和上边0.9(0.2+0.7)倍。

这个方法的好处在于我们可以根据自己的需要自由的控制画布以及坐标轴对象,灵活的实现各种需求,比如可以绘制一个图中图(即在一张画布上创建两个坐标轴对象):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2,2,20)
y1 = 2*x+1
y2 = x**2

fig = plt.figure()
ax1 = fig.add_axes([0.2,0.2,0.7,0.7])
ax2 = fig.add_axes([0.5,0.5,0.2,0.2])

ax1.plot(x,y1,c = "r")
ax2.plot(x,y2,c = "b")

plt.show()

坐标轴属性设置

对数坐标轴设置

设置X/Y轴为“对数轴”:

  • axes.set_xscale('log')
  • axes.set_yscale('log')

坐标轴标签

设置X/Y轴标签以及标签字体大小:

  • axes.set_xlabel('X轴标签',fontsize=12)
  • axes.set_ylabel('Y轴标签',fontsize=12)

坐标轴刻度范围

设置X/Y轴刻度范围:

  • axes.set_xlim(xmin,xmax)
  • axes.set_ylim(ymin,ymax)

坐标轴刻度

设置X/Y轴要显示的刻度:

1
Axes.set_xticks(self, ticks, minor=False)
  • ticks:一个刻度位置列表
  • minor(可选):bool型变量,如果设置为False,那么设置的是主刻度,否则为次刻度

下面是例子:

  • axes.set_xticks([-2,-1,0,1,2])
  • axes.set_yticks([0,1,2,3,4])

坐标轴刻度标签

设置X/Y轴刻度标签:

1
Axes.set_xticklabels(self, labels, fontdict=None, minor=False, **kwargs)
  • labels:一个标签列表
  • fontdict(可选):字典变量,控制刻度标签的显示,默认为:
1
2
3
4
5
6
{
'fontsize': rcParams['axes.titlesize'],
'fontweight': rcParams['axes.titleweight'],
'verticalalignment': 'baseline',
'horizontalalignment': loc
}
  • minor(可选):bool型变量,如果设置为False,那么设置的是主刻度,否则为次刻度

下面是一个例子:

  • axes.set_xticklabels(["a","b","c","d","e"])
  • axes.set_yticklabels(["a","b","c","d","e"])

坐标轴刻度文字方向

我们可以通过下面的代码来旋转轴刻度上文字方向:

1
axes.set_xticklabels(axes.get_xticklabels(),rotation = 90)

脊柱(Spines)设置

axes.spines属于collections.OrderedDict类:

1
2
3
4
OrderedDict([('left', <matplotlib.spines.Spine at 0x28accd1a710>),
('right', <matplotlib.spines.Spine at 0x28accd1a550>),
('bottom', <matplotlib.spines.Spine at 0x28accd1af98>),
('top', <matplotlib.spines.Spine at 0x28accd1a9b0>)])

我们可以通过axes.spines得到axis对象,即4个边框,使用['right']、['left']、['top']、['bottom']可以分别提取出四个边框。

去掉脊柱

我们可以通过如下代码去掉脊柱:

1
2
3
4
axes.spines['top'].set_visible(False)    # 去掉上边框  
axes.spines['bottom'].set_visible(False) # 去掉下边框
axes.spines['left'].set_visible(False) # 去掉左边框
axes.spines['right'].set_visible(False) # 去掉右边框

脊柱颜色设置

设置边框(坐标轴)颜色:

1
2
3
4
axes.spines['right'].set_color('none')  # 设置右边框为无色,默认为黑色
axes.spines['top'].set_color('none') # 设置上边框为无色,默认为黑色
axes.spines['left'].set_color('r') # 设置左边框为红色,默认为黑色
axes.spines['bottom'].set_color('r') # 设置下边框为红色,默认为黑色

脊柱位置设置

我们可以使用axes.spines[].set_position()来设置脊柱位置,位置的属性包括:outwardaxesdata

  • outward:将spine从数据区域中移出指定的点数。(正值指定向外移动,负值表示向内移动)
    • 向内、向外视具体的spine而定,例如axes.spines['left']的向外是向左,而axes.spines['right']的向外是向右。
  • axes:X/Y轴的比例(从0.0-1.0)
  • data:X/Y轴具体的数值
1
2
3
4
5
6
7
8
# 把bottom坐标轴的位置设定在y刻度为0的位置
axes.spines['bottom'].set_position(('data', 0))

# 把bottom坐标轴的位置设定在y刻度为20%的位置
axes.spines['bottom'].set_position(('axes', 0.2))

# 把left坐标轴的位置向左移动100个点
axes.spines['left'].set_position(('outward', 100))

----------- 本文结束啦感谢您阅读 -----------

赞赏一杯咖啡

欢迎关注我的其它发布渠道