轴比例(scales)和刻度(ticks)
每个Axes(坐标作图组件——图表域)有两个(或三个)轴(Axis)对象表示x轴和y轴(和z轴)。这些控件控制轴的比例、刻度定位器和刻度格式器。另外,Axes可以附加显示其他轴对象。
Axis:
https://matplotlib.org/stable/api/axis_api.html#matplotlib.axis.Axis
比例(Scales)
除了线性比例,Matplotlib还支持非线性比例,例如对数比例。由于对数比例被广泛使用,所以设置了直接的方法,如loglog(双对数)、semilogx(x半对数)和semilogy(y半对数)。还有很多其他的比例(参见Scales)。loglog:https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.loglog.html#matplotlib.axes.Axes.loglogsemilogx:https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.semilogx.html#matplotlib.axes.Axes.semilogxsemilogy:https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.semilogy.html#matplotlib.axes.Axes.semilogyScales:
https://matplotlib.org/stable/gallery/scales/scales.html
下面的代码手动设置比例:
·
·
·
·
·
·
·
·
·
·
·
import matplotlib.pyplot as pltimport numpy as npnp.random.seed(19680801) # seed the random number generator.data1, = np.random.randn(1, 100) # make 1 random data setsfig, axs = plt.subplots(1, 2, figsize=(5, 2.7), layout='constrained')xdata = np.arange(len(data1)) # make an ordinal for thisdata = 10**data1axs[0].plot(xdata, data)axs[1].set_yscale('log')axs[1].plot(xdata, data);fig.show()
比例(scale)设置了从数据值到轴间距的映射。这在两个方向上都会发生,统称为变换(transform)——Matplotlib把数据坐标映射到Axes(坐标作图组件——图表域)、Figure(图表)或屏幕坐标的方式。请参见变换教程:
https://matplotlib.org/stable/tutorials/advanced/transforms_tutorial.html。
刻度定位器和格式器
每个轴(Axis)都有一个刻度定位器(locator)和格式器(formatter),用于选择沿Axis对象放置刻度的位置。一个简单的接口是set_xticks:
https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_xticks.html#matplotlib.axes.Axes.set_xticks
·
·
·
·
·
·
·
·
·
·
·
·
·
import matplotlib.pyplot as pltimport numpy as npnp.random.seed(19680801) # seed the random number generator.data1, = np.random.randn(1, 100) # make 1 random data setsxdata = np.arange(len(data1)) # make an ordinal for thisfig, axs = plt.subplots(2, 1, layout='constrained')axs[0].plot(xdata, data1)axs[0].set_title('Automatic ticks')axs[1].plot(xdata, data1)axs[1].set_xticks(np.arange(0, 100, 30), ['zero', '30', 'sixty', '90'])axs[1].set_yticks([-1.5, 0, 1.5]) # note that we don't need to specify labelsaxs[1].set_title('Manual ticks');fig.show()
不同的比例(scales)可以有不同的定位器和格式器;例如,上面的对数比例(log-scale)使用对数刻度定位器(LogLocator)和对数刻度格式器(LogFormatter)。要了解其他格式器和定位器以及有关自己编写的信息,请参阅刻度定位器(Tick locators)和刻度格式器(Tick formatters)。LogLocator:https://matplotlib.org/stable/api/ticker_api.html#matplotlib.ticker.LogLocatorLogFormatter:https://matplotlib.org/stable/api/ticker_api.html#matplotlib.ticker.LogFormatterTick locators:https://matplotlib.org/stable/gallery/ticks/tick-locators.htmlTick formatters:
https://matplotlib.org/stable/gallery/ticks/tick-formatters.html
绘制日期和字符串
Matplotlib可以与绘制浮点数一样,绘制日期数组、字符串数组。根据需要使用特殊的定位器和格式化程序进行处理。对于日期:
·
·
·
·
·
·
·
·
·
·
·
·
import matplotlib as mplimport matplotlib.pyplot as pltimport numpy as npnp.random.seed(19680801) # seed the random number generator.fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')dates = np.arange(np.datetime64('2021-11-15'), np.datetime64('2021-12-25'), np.timedelta64(1, 'h'))data = np.cumsum(np.random.randn(len(dates)))ax.plot(dates, data)cdf = mpl.dates.ConciseDateFormatter(ax.xaxis.get_major_locator())ax.xaxis.set_major_formatter(cdf);fig.show()
有关日期刻度的更多信息,请参阅日期示例,例如日期刻度标签(Date tick labels):
https://matplotlib.org/stable/gallery/text_labels_and_annotations/date.html。
对于字符串刻度,如分类绘图表,参阅绘制分类变量(Plotting categorical variables):
https://matplotlib.org/stable/gallery/lines_bars_and_markers/categorical_variables.html
·
·
·
·
·
·
·
import matplotlib.pyplot as pltimport numpy as npnp.random.seed(19680801) # seed the random number generator.fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')categories = ['turnips', 'rutabaga', 'cucumber', 'pumpkins']ax.bar(categories, np.random.rand(len(categories)))fig.show()
关于分类图表的一个警告,某些分析文本文件的方法会返回字符串列表,就算这些字符串都表示数字或日期。如果向Matplotlib传递1000个字符串,它会绘制1000个刻度!
附加轴(Axis)对象
在一个图表中绘制不同大小的数据可能需要额外的y轴(y-axis)。通过现有的Axes对象的twinx方法创建一个新的Axes,该Axes具有一个不可见的x轴(与原x轴重叠)和一个位于右侧的y轴;twiny方法与之类似,附加x轴在图表顶部。另一个示例,参见不同比例的图表(Plots with different scales)。twinx:https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.twinx.html#matplotlib.axes.Axes.twinxtwiny:https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.twiny.html#matplotlib.axes.Axes.twinyPlots with different scales:
https://matplotlib.org/stable/gallery/subplots_axes_and_figures/two_scales.html
下一例子生成两个图表,左图表用twinx产生以右(right)轴为y轴的Axes,绘制积累数据个数直线;右图表用twiny产生以上(top)轴为x轴的Axes,把水平变量数组转为度数绘制(一定要,否则刻度不对):
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
import matplotlib.pyplot as pltimport numpy as npt = np.arange(0.0, 5.0, 0.01)s = np.cos(2 * np.pi * t)fig, (ax1, ax3) = plt.subplots(1, 2, figsize=(7, 2.7), layout='constrained')l1, = ax1.plot(t, s)ax2 = ax1.twinx()l2, = ax2.plot(t, range(len(t)), 'C1')ax2.legend([l1, l2], ['Sine (left)', 'Straight (right)'])ax3.plot(t, s)ax3.set_xlabel('Angle [rad]')ax4 = ax3.twiny()ax4.plot(np.rad2deg(t), s)ax4.set_xlabel('Angle [°]')fig.show()
类似地,可以通过secondary_xaxis或secondary_yaxis添加与主轴不同比例的轴(Axis),这样,图表上可以看到不同比例或单位表示的数据。更多示例,请参见副轴(Secondary Axis)。注意:该方法并没有产生新的Axes,新生成的副轴归原Axes所有。secondary_xaxis:https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.secondary_xaxis.html#matplotlib.axes.Axes.secondary_xaxissecondary_yaxis:https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.secondary_yaxis.html#matplotlib.axes.Axes.secondary_yaxisSecondary Axis:
https://matplotlib.org/stable/gallery/subplots_axes_and_figures/secondary_axis.html
下一例子生成两个图表,左图表用secondary_yaxis产生右(right)侧为y副轴(坐标乘100倍,functions元组第二项为逆函数),绘制标签“/100”;右图表用secondary_xaxis产生上(top)侧为x轴副(把弧度坐标转为角度,第二项为逆函数):
·
·
·
·
·
·
·
·
·
·
·
·
·
·
import matplotlib.pyplot as pltimport numpy as npt = np.arange(0.0, 5.0, 0.01)p = np.arange(1.0, 0.0, -0.002) #衰减因子s = p * np.cos(2 * np.pi * t)fig, (ax1, ax3) = plt.subplots(1, 2, figsize=(7, 2.7), layout='constrained')l1, = ax1.plot(t, s)ax2 = ax1.secondary_yaxis('right', functions=(lambda x: x * 100, lambda x: x / 100))ax2.set_ylabel('/100')ax3.plot(t, s)ax3.set_xlabel('Angle [rad]')ax4 = ax3.secondary_xaxis('top', functions=(np.rad2deg, np.deg2rad))ax4.set_xlabel('Angle [°]')fig.show()
通过上面的例子得到,twinx和twiny适合组合图表;secondary_xaxis和secondary_ yaxis只方便用户同时看到不同比例或单位的数值。