艺术画笔见乾坤—Matplotlib

艺术画笔见乾坤—Matplotlib

绘图步骤

matplotlib的原理或者说基础逻辑是,用Artist对象在画布(canvas)上绘制(Render)图形。这与人作画的步骤类似:

  1. 准备一块画布或画纸
  2. 准备好颜料、画笔等制图工具
  3. 作画

所以相对,matplotlib有三个层次的API:

matplotlib.backend_bases.FigureCanvas 代表了绘图区,所有的图像都是在绘图区完成的
matplotlib.backend_bases.Renderer 代表了渲染器,可以近似理解为画笔,控制如何在 FigureCanvas 上画图。
matplotlib.artist.Artist 代表了具体的图表组件,即调用了Renderer的接口在Canvas上作图。
前两者处理程序和计算机的底层交互的事项,第三项Artist就是具体的调用接口来做出我们想要的图,比如图形、文本、线条的设定。所以通常来说,我们95%的时间,都是用来和matplotlib.artist.Artist类打交道的。

Artist分类

Artist有两种类型:primitives 和 containers

  • primitives 是基本要素,它包含一些我们在绘图区昨天用到的标准图形对象,如曲线Line2D,文字text,矩形Rectangle,图像image等。
  • container是容器,即用来装基本要素的地方,包括图形figure、坐标系Axes和坐标轴Axis。他们之间的关系如下图所示:

分类可视化中常见的artist类可以参考下图这张表格。

Axes helper methodArtistContainer
bar - bar chartsRectangleax.patches
errorbar - error bar plotsLine2D and Rectangleax.lines and ax.patches
fill - shared areaPolygonax.patches
hist - histogramsRectangleax.patches
imshow - image dataAxesImageax.images
plot - xy plotsLine2Dax.lines
scatter - scatter chartsPolyCollectionax.collections
  • Axes helper methord 表示matplotlib中子图上的辅助方法,可以理解为可视化中不同种类的图表类型,如柱状图,折线图,直方图等,这些图表都可以用这些辅助方法直接画出来,属于更高层级的抽象。

  • Artist 表示不同图表背后的artist类,比如折线图方法plot在底层用到的就是Line2D这一artist类。

  • Container 是第二列的列表容器,例如所有在子图中创建的Line2D对象都会被自动收集到ax.lines返回的列表中。

后面的案例更清楚地阐释了这三者的关系,其实在很多时候,我们只用记住第一列的辅助方法进行绘图即可,而无需关注具体底层使用了哪些类,但是了解底层类有助于我们绘制一些复杂的图表,因此也很有必要了解。

基本元素-primitives

各容器中可能会包含多种基本要素-primitives, 所以先介绍下primitives,再介绍容器。

本章重点介绍下 primitives 的几种类型:曲线-Line2D,矩形-Rectangle,多边形-Polygon,图像-image

1. Line2D

matplotlib中曲线的绘制,主要是通过类matplotlib.lines.Line2D来完成。其中line的含义:表示的可以是连接所有顶点的实线样式,也可以是每个顶点的标记。此外,这条线也会受到绘画风格的影响,比如,我们可以创建虚线种类的线。

它的构造函数:

class matplotlib.lines.Line2D(xdata, ydata, linewidth=None, linestyle=None, color=None, marker=None, markersize=None, markeredgewidth=None, markeredgecolor=None, markerfacecolor=None, markerfacecoloralt=‘none’, fillstyle=None, antialiased=None, dash_capstyle=None, solid_capstyle=None, dash_joinstyle=None, solid_joinstyle=None, pickradius=5, drawstyle=None, markevery=None, **kwargs)

其中常用的参数有:

  • xdata:需要绘制的line中点的在x轴上的取值,若忽略,则默认为range(1,len(ydata)+1)
  • ydata:需要绘制的line中点的在y轴上的取值
  • linewidth:线条的宽度
  • linestyle:线型
  • color:线条的颜色
  • marker:点的标记,详细可参考markers API
  • markersize:标记的size

其他详细参数可参考Line2D官方文档

1.1 如何设置Line2D的属性

有三种方法可以用设置线的属性:

  1. 直接在plot()函数中设置

  2. 通过获得线对象,对线对象进行设置

  3. 获得线属性,使用setp()函数设置

    # 直接在plot()函数中设置
    x = range(0,5)
    y = [2,5,7,8,10]
    plt.plot(x,y, linewidth=10); # 设置线的粗细参数为10
    

    ../_images/index_2_01.png

# 面向对象,通过获取线对象,然后对其属性进行设置
x = range(0,5)
y = [2,5,7,8,10]
line, = plt.plot(x, y, '-') # 这里等号坐标的line,是一个列表解包的操作,目的是获取plt.plot返回列表中的Line2D对象
line.set_antialiased(False); # 关闭抗锯齿功能

../_images/index_3_01.png

# 也可以先获得线属性,使用step函数设置
x = range(0,5)
y = [2,5,7,8,10]
lines = plt.plot(x, y)
plt.setp(lines, color='r', linewidth=10);

../_images/index_4_01.png

1.2 如何绘制line
  1. 绘制直线line
  2. errorbar绘制误差折线图

**1)**介绍两种绘制直线line常用的方法:

  • plot方法绘制
  • Line2D对象绘制
# 1. plot方法绘制
x = range(0,5)
y1 = [2,5,7,8,10]
y2= [3,6,8,9,11]

fig,ax= plt.subplots()
ax.plot(x,y1)
ax.plot(x,y2)
print(ax.lines);
# 通过直接使用辅助方法画线,打印ax.lines后可以看到在matplotlib在底层创建了两个Line2D对象
[<matplotlib.lines.Line2D object at 0x000001EBFE710A90>, <matplotlib.lines.Line2D object at 0x000001EBFE710E20>]

../_images/index_6_1.png

# 2. Line2D对象绘制

x = range(0,5)
y1 = [2,5,7,8,10]
y2= [3,6,8,9,11]
fig,ax= plt.subplots()
lines = [Line2D(x, y1), Line2D(x, y2,color='orange')]  # 显式创建Line2D对象
for line in lines:
    ax.add_line(line) # 使用add_line方法将创建的Line2D添加到子图中
ax.set_xlim(0,4)
ax.set_ylim(2, 11);

../_images/index_7_01.png

2)errorbar 绘制误差折线图

pyplot 里有个专门绘制误差线的功能,通过 errorbar 类实现,它的构造函数:

matplotlib.pyplot.errorbar(x, y, yerr=None, xerr=None, fmt='', ecolor=None, elinewidth=None, capsize=None, barsabove=False, lolims=False, uplims=False, xlolims=False, xuplims=False, errorevery=1, capthick=None, *, data=None, **kwargs)

其中最主要的参数包括:

  • x:需要绘制的 line 中点的在 x 轴上的取值
  • y:需要绘制的 line 中点的在 y 轴上的取值
  • yerr:指定 y 轴水平的误差
  • xerr:指定 x 轴水平的误差
  • fmt:指定折线图中某个点的颜色,形状,线条风格,例如 co--
  • ecolor:指定 error bar 的颜色
  • elinewidth:指定 error bar 的线条宽度

绘制 errorbar

fig = plt.figure()
x = np.arange(10)
y = 2.5 * np.sin(x / 20* np.pi)
yerr = np.linspace(0.05, 0.2, 10)
plt.errorbar(x, y + 3, yerr = yerr, label = 'both limits (default)')

Result:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5gebYPxS-1642332626530)(data:image/png;base64,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)]

2.patches

matplotlib.patches.Patch 类是二维图形类,并且它是众多二维图形的父类,它的所有子类见 matplotlib.patches APIPatch 类的构造函数:

Patch(edgecolor=None, facecolor=None, color=None, linewidth=None, linestyle=None, antialiased=None, hatch=None, fill=True, capstyle=None, joinstyle=None, **kwargs)

本小节主要聚焦三种最常见的子类,矩形、多边形和楔形。

  1. Rectangle-矩形

    Rectangle 矩形类在官网中的定义是:通过描点 xy 及宽度和高度生成。Rectangle 本身主要比较简单,即 xy 控制描点,widthheight 分别控制宽和高。它的构造函数:

    class matplotlib.patches.Rectangle(xy, width, height, angle=0.0, **kwargs)
    

    在实际使用过程中最常用的是 hist 直方图bar 条形图

    • hist 直方图

      matplotlib.pyplot.hist(x,bins=None,range=None, density=None, bottom=None, histtype='bar', align='mid', log=False, color=None, label=None, stacked=False, normed=None)
      

      常用参数及含义:

      • x: 数据集,最终的直方图将对数据集进行统计
      • bins: 统计的区间分布
      • range: tuple, 显示的区间,range 在没有给出 bins 时生效
      • density: bool,默认为 false,显示的是频数统计结果,为 True 则显示频率统计结果,这里需要注意,频率统计结果=区间数目/(总数*区间宽度),和 normed 效果一致,官方推荐使用 density
      • histtype: 可选{bar, barstacked, step, stepfilled}之一,默认为 bar,推荐使用默认配置,step 使用的是梯状,stepfilled 则会对梯状内部进行填充,效果与 bar 类似
      • align: 可选{left, mid, right}之一,默认为 mid,控制柱状图的水平分布,left 或者 right,会有部分空白区域,推荐使用默认
      • log: bool,默认 False,即 y 坐标轴是否选择指数刻度
      • stacked: bool,默认为 False,是否为堆积状图

    hist绘制直方图

    x=np.random.randint(0,100,100) #生成[0-100)之间的100个数据,即 数据集 
    bins=np.arange(0,101,10) #设置连续的边界值,即直方图的分布区间[0,10),[10,20)... 
    plt.hist(x,bins,color='fuchsia',alpha=0.5)#alpha设置透明度,0为完全透明 
    plt.xlabel('scores') 
    plt.ylabel('count') 
    plt.xlim(0,100); #设置x轴分布范围 
    plt.show()
    

    Rectangle 矩阵类绘制直方图

    df = pd.DataFrame(columns = ['data'])
    df.loc[:,'data'] = x
    df['fenzu'] = pd.cut(df['data'], bins=bins, right = False,include_lowest=True)
    
    df_cnt = df['fenzu'].value_counts().reset_index()
    df_cnt.loc[:,'mini'] = df_cnt['index'].astype(str).map(lambda x:re.findall('\[(.*)\,',x)[0]).astype(int)
    df_cnt.loc[:,'maxi'] = df_cnt['index'].astype(str).map(lambda x:re.findall('\,(.*)\)',x)[0]).astype(int)
    df_cnt.loc[:,'width'] = df_cnt['maxi']- df_cnt['mini']
    df_cnt.sort_values('mini',ascending = True,inplace = True)
    df_cnt.reset_index(inplace = True,drop = True)
    
    #用Rectangle把hist绘制出来
    
    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    
    for i in df_cnt.index:
        rect =  plt.Rectangle((df_cnt.loc[i,'mini'],0),df_cnt.loc[i,'width'],df_cnt.loc[i,'fenzu'])
        ax1.add_patch(rect)
    
    ax1.set_xlim(0, 100)
    ax1.set_ylim(0, 16)
    
    • bar 柱状图

      matplotlib.pyplot.bar(left, height, alpha=1, width=0.8, color=, edgecolor=, label=, lw=3)
      

      常用的参数:

      • left:x轴的位置序列,一般采用range函数产生一个序列,但是有时候可以是字符串
      • height:y轴的数值序列,也就是柱形图的高度,一般就是我们需要展示的数据;
      • alpha:透明度,值越小越透明
      • width:为柱形图的宽度,一般这是为0.8即可;
      • color或facecolor:柱形图填充的颜色;
      • edgecolor:图形边缘颜色
      • label:解释每个图像代表的含义,这个参数是为legend()函数做铺垫的,表示该次bar的标签

      与上述类似,同样有两种方式绘制柱状图:

      • bar 绘制柱状图
      • Rectangle矩形类绘制柱状图

    bar 绘制柱状图

    y = range(1,17)
    plt.bar(np.arange(16), y, alpha=0.5, width=0.5, color='yellow', edgecolor='red', label='The First Bar', lw=3);
    

    Results:

    img

    Rectangle

    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    
    for i in range(1, 17):
      rect = plt.Rectangle((i+0.25, 0), 0.5, i)
      ax1.add_patch(rect)
    ax1.set_xlim(0, 16)
    ax1.set_ylim(0, 16);
    

    Results:

    1. Polygon-多边形

    matplotlib.patches.Polygon 类是多边形类,它的构造函数:

    class matplotlib.patches.Polygon(xy, closed=True, **kwargs)
    

    参数说明:

    • xy 是一个 N \times 2N×2 的 numpy.array,为多边形的顶点。
    • closedTrue 则制定多边形将起点和终点重合从而显式关闭多边形。

    matplotlib.patches.Polygon 类中常用的是 fill 类,它是基于 xy 绘制一个填充的多边形,它的定义:

    matplotlib.pyplot.fill(args, data=None, *kwargs)
    

    参数说明:关于 xycolor 的序列,其中 color 是可选的参数,每个多边形都是由其他节点的 xy 位置列表定义,后面可以选择一个颜色说明符。

    fill 来绘制图形

    x = np.linspace(0, 5*np.pi, 1000)
    y1 = np.sin(x)
    y2 = np.sin(2*x)
    plt.fill(x, y1, color = 'g', alpha = 0.3);
    

    Results:

    1. Wedge-楔形

    matplotlib.patches.Wedge 类是楔形类,构造函数为:

    class matplotlib.patches.Wedge(center, r, theta1, theta2, width=None, **kwargs)
    

    一个 Wedge-楔形是以坐标 x, y 为中心,半径为 r,从 \theta_1θ1 扫到 \theta_2θ2(单位是度)。如果宽度给定,则从内半径 r-宽度 到外半径 r 画出部分楔形。wedge 中比较常见的是绘制饼状图。

    以绘制饼图为例。通常我们可以使用 matplotlib.pyplot.pie 直接绘制饼图,其构造函数有如下:

    matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)
    

    制作数据 x 的饼图,每个楔子的面积用 x/sum(x) 表示。其主要的参数是前四个:

    • x:契型的形状,一维数组。
    • explode:如果不是等于 None,则是一个 len(x) 数组,它指定用于偏移每个楔形块的半径的分数;
    • labels:用于指定每个契型块的标记,取值是列表或为 None
    • colors:饼图循环使用的颜色序列。如果取值为 None,将使用当前活动循环中的颜色;
    • startangle:饼状图开始的绘制的角度。

    pie 函数绘制饼图

    labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
    sizes = [15, 30, 45, 10]
    explode = (0, 0.1, 0, 0)
    fig1, ax1 = plt.subplots()
    ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90)
    ax1.axis('equal'); # Equal aspect ratio ensures that pie is drawn as a circle.
    

    wedge 绘制饼图

    fig = plt.figure(figsize=(5,5))
    ax1 = fig.add_subplot(111)
    theta1 = 0
    sizes = [15, 30, 45, 10]
    patches = []
    patches += [
        Wedge((0.5, 0.5), .4, 0, 54),           
        Wedge((0.5, 0.5), .4, 54, 162),  
        Wedge((0.5, 0.5), .4, 162, 324),           
        Wedge((0.5, 0.5), .4, 324, 360),  
    ]
    colors = 100 * np.random.rand(len(patches))
    p = PatchCollection(patches, alpha=0.8)
    p.set_array(colors)
    ax1.add_collection(p);
    

3.collection

collections 类是用来绘制一组对象的集合,collections 有许多不同的子类,如 RegularPolyCollectionCircleCollection, Pathcollection,分别对应不同的集合子类型。其中比较常用的是散点图,它是属于 PathCollection 子类,scatter 方法提供了该类的封装,根据 xy 绘制不同大小或颜色标记的散点图。它的构造方法:

Axes.scatter(self, x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=, edgecolors=None, , plotnonfinite=False, data=None, *kwargs)

主要参数为:

  • x:数据点x轴的位置
  • y:数据点y轴的位置
  • s:尺寸大小
  • c:可以是单个颜色格式的字符串,也可以是一系列颜色
  • marker: 标记的类型

scatter 绘制散点图

x = [0,2,4,6,8,10]
y = [10]*len(x)
s = [20*2**n for n in range(len(x))]
plt.scatter(x,y,s=s) ;
  1. images

    imagesmatplotlib 中绘制 image 图像的类,其构造函数:

    class matplotlib.image.AxesImage(ax, cmap=None, norm=None, interpolation=None, origin=None, extent=None, filternorm=True, filterrad=4.0, resample=False, **kwargs)
    

    最常用的 imshow 可以根据数组绘制成图像,它的构造函数:

    matplotlib.pyplot.imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=, filternorm=1, filterrad=4.0, imlim=, resample=None, url=None, , data=None, *kwargs)
    

    使用 imshow 画图时首先需要传入一个数组,数组对应的是空间内的像素位置和像素点的值,interpolation 参数可以设置不同的插值方法,具体效果如下:

    methods = [None, 'none', 'nearest', 'bilinear', 'bicubic', 'spline16',
               'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric',
               'catrom', 'gaussian', 'bessel', 'mitchell', 'sinc', 'lanczos']
    
    grid = np.random.rand(4, 4)
    
    fig, axs = plt.subplots(nrows=3, ncols=6, figsize=(9, 6),
                            subplot_kw={'xticks': [], 'yticks': []})
    
    for ax, interp_method in zip(axs.flat, methods):
        ax.imshow(grid, interpolation=interp_method, cmap='viridis')
        ax.set_title(str(interp_method))
    
    plt.tight_layout();
    

    Results:

    img

    Note:其中,nrowsncols 分别表示子图的行和列,此处表示 36 列。返回值 axs18 个子图,因此可以通过 for 循环对其进行遍历,并对各个子图的属性进行修改。

对象容器—Object container

容器会包含一些primitives,并且容器还有它自身的属性。
比如Axes Artist,它是一种容器,它包含了很多primitives,比如Line2DText;同时,它也有自身的属性,比如xscal,用来控制X轴是linear还是log的。

1.Figure 容器

matplotlib.figure.FigureArtist 最顶层的 container -对象容器,它包含了图表中的所有元素。一张图表的背景就是在 Figure.patch 的一个矩形 Rectangle
当我们向图表添加 Figure.add_subplot() 或者 Figure.add_axes() 元素时,这些都会被添加到 Figure.axes 列表中。

fig = plt.figure()
ax1 = fig.add_subplot(211) # 作一幅2*1的图,选择第1个子图
ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.3]) # 位置参数,四个数分别代表了(left,bottom,width,height)
print(ax1)
print(fig.axes) # fig.axes 中包含了subplot和axes两个实例, 刚刚添加的

Results:

img

  • Note

    我们发现,这里面得到的两个子图没有对齐,这是为什么呢?因为 add_axes 是以 figure 容器为基准进行对齐的。

    接下来,为了突出两种方式的区别,我们对图形重新绘制:

    fig = plt.figure()
    ax1 = fig.add_subplot(211) # 作一幅2*1的图,选择第1个子图
    ax1 = fig.add_subplot(212)
    ax2 = fig.add_axes([0.0, 0., 0.7, 0.3]) # 位置参数,四个数分别代表了(left,bottom,width,height)
    print(ax1)
    print(fig.axes) # fig.axes 中包含了subplot和axes两个实例, 刚刚添加的
    plt.show()
    

    可以发现,两个的基准对齐位置不同,可以理解为,add_subplot 是重新创建了一个 subplot 容器,因此,在基于此函数进行增添子图的时候,是在容器内部进行对齐。而 add_axes 则默认是基于 figure 进行操作和对齐。如果要在这种情况下进行对齐,可以首先获得 subplot 的位置信息。

    fig = plt.figure()
    ax1 = fig.add_subplot(211) # 作一幅2*1的图,选择第1个子图
    
    position = ax1.get_position()
    
    #(x0, y0) and (x1, y1) represent the the point coordinates of the lower left and upper right corner respectively
    width = position.x1 - position.x0
    height = position.y1 - position.y0
    
    ax2 = fig.add_axes([position.x0, position.y0 - 0.4, width, height]) # 位置参数,四个数分别代表了(left,bottom,width,height)
    print(ax1)
    print(fig.axes) # fig.axes 中包含了subplot和axes两个实例, 刚刚添加的
    plt.show()
    

    Results:

    Note: ax1.get_position 返回一个 Bbox 对象,可以通过其 x0, y0, x1y1 得到左下角和右上角的坐标信息。即:

    综上,通过获得位置参数之后,将两张子图进行了对齐。

由于 Figure 维持了 current axes,因此你不应该手动的从 Figure.axes 列表中添加删除元素,而是要通过 Figure.add_subplot()Figure.add_axes() 来添加元素,通过Figure.delaxes()来删除元素。但是你可以迭代或者访问 Figure.axes 中的 Axes,然后修改这个 Axes 的属性。

比如下面的遍历 axes 里的内容,并且添加网格线:

fig = plt.figure()
ax1 = fig.add_subplot(211)

for ax in fig.axes:
    ax.grid(True)

Results:

img

Figure 也有它自己的 textlinepatchimage。你可以直接通过 add primitive 语句直接添加。但是注意 Figure 默认的坐标系是以像素为单位,需要转换成 figure 坐标系:(0,0) 表示左下点,(1,1) 表示右上点。

Figure容器的常见属性:

  • Figure.patch属性:Figure 的背景矩形
  • Figure.axes属性:一个 Axes 实例的列表(包括 Subplot)
  • Figure.images属性:一个 FigureImages patch 列表
  • Figure.lines属性:一个 Line2D 实例的列表(很少使用)
  • Figure.legends属性:一个 Figure Legend 实例列表(不同于 Axes.legends)
  • Figure.texts属性:一个 Figure Text 实例列表

2.Axes 坐标系容器

matplotlib.axes.Axesmatplotlib 的核心。大量的用于绘图的 Artist 存放在它内部,并且它有许多辅助方法来创建和添加 Artist 给它自己,而且它也有许多赋值方法来访问和修改这些 Artist

Figure 容器类似,Axes 包含了一个 patch 属性,对于笛卡尔坐标系而言,它是一个 Rectangle;对于极坐标而言,它是一个 Circle。这个 patch 属性决定了绘图区域的形状、背景和边框。

fig = plt.figure()
ax = fig.add_subplot(111)
rect = ax.patch  # axes的patch是一个Rectangle实例
rect.set_facecolor('green')

Results:

img

Axes有许多方法用于绘图,如.plot()、.text()、.hist()、.imshow()等方法用于创建大多数常见的primitive(如Line2D,Rectangle,Text,Image等等)。在primitives中已经涉及,不再赘述。

Subplot 就是一个特殊的 Axes,其实例是位于网格中某个区域的 Subplot 实例。其实你也可以在任意区域创建 Axes,通过下述代码来创建一个任意区域的 Axes

Figure.add_axes([left,bottom,width,height])

其中,left, bottom, width, height 都是 [0—1] 之间的浮点数,他们代表了相对于 Figure 的坐标。

你不应该直接通过 Axes.linesAxes.patches 列表来添加图表。因为当创建或添加一个对象到图表中时,Axes会做许多自动化的工作:

  • 它会设置 Artistfigureaxes 的属性,同时默认 Axes 的转换;
  • 它也会检视 Artist 中的数据,来更新数据结构,这样数据范围和呈现方式可以根据作图范围自动调整。

可以使用Axes的辅助方法 .add_line().add_patch() 方法来直接添加。

此外,Axes 还包含两个最重要的 Artist container

  • ax.xaxisXAxis 对象的实例,用于处理 xtick 以及 label 的绘制;
  • ax.yaxisYAxis 对象的实例,用于处理 ytick 以及 label 的绘制;

Axes容器的常见属性有:

  • artists: Artist 实例列表
  • patch: Axes 所在的矩形实例
  • collections: Collection 实例
  • images: Axes 图像
  • legends: Legend 实例
  • lines: Line2D 实例
  • patches: Patch 实例
  • texts: Text 实例
  • xaxis: matplotlib.axis.XAxis 实例
  • yaxis: matplotlib.axis.YAxis 实例

3.Axis 坐标轴容器

matplotlib.axis.Axis 实例处理 tick linegrid linetick label 以及 axis label 的绘制,它包括坐标轴上的刻度线、刻度 label、坐标网格、坐标轴标题。通常可以独立的配置 y 轴的左边刻度以及右边的刻度,也可以独立地配置 x 轴的上边刻度以及下边的刻度。

刻度包括主刻度和次刻度,它们都是 Tick 刻度对象。

Axis 也存储了用于自适应、平移以及缩放的 data_intervalview_interval。它还有 Locator 实例和 Formatter 实例用于控制刻度线的位置以及刻度 label

每个 Axis 都有一个 label 属性,也有主刻度列表和次刻度列表。这些 ticksaxis.XTickaxis.YTick 实例,它们包含着 line primitive 以及 text primitive 用来渲染刻度线以及刻度文本。

刻度是动态创建的,只有在需要创建的时候才创建(比如缩放的时候)。Axis 也提供了一些辅助方法来获取刻度文本、刻度线位置等等:

常见的如下:

# 不用print,直接显示结果
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

fig, ax = plt.subplots()
x = range(0,5)
y = [2,5,7,8,10]
plt.plot(x, y, '-')

axis = ax.xaxis # axis为X轴对象
  • 获取刻度线位置

    axis.get_ticklocs()     # 获取刻度线位置
    

    Results:

    array([-0.5,  0. ,  0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5])
    
  • 获取刻度线 label 列表

    返回一个 Text 实例的列表,可以通过 minor=True|False 关键字参数控制输出 minor 还是 majortick label

    axis.get_ticklabels()
    

    Results:

    [Text(-0.5, 0, '−0.5'),
     Text(0.0, 0, '0.0'),
     Text(0.5, 0, '0.5'),
     Text(1.0, 0, '1.0'),
     Text(1.5, 0, '1.5'),
     Text(2.0, 0, '2.0'),
     Text(2.5, 0, '2.5'),
     Text(3.0, 0, '3.0'),
     Text(3.5, 0, '3.5'),
     Text(4.0, 0, '4.0'),
     Text(4.5, 0, '4.5')]
    
  • 获取刻度线列表

    一个 Line2D 实例的列表。可以通过 minor=True|False 关键字参数控制输出 minor 还是 majortick line

    axis.get_ticklines()    # 获取刻度线列表(
    

    Results:

    <a list of 22 Line2D ticklines objects>
    
  • 获取轴刻度间隔

    axis.get_data_interval()
    

    Results:

    array([0., 4.])
    
  • 获取轴视角(位置)的间隔

    axis.get_view_interval()
    

    Results:

    array([-0.2,  4.2])
    

下面的例子展示了如何调整一些轴和刻度的属性(忽略美观度,仅作调整参考):

fig = plt.figure() # 创建一个新图表
rect = fig.patch   # 矩形实例并将其设为黄色
rect.set_facecolor('lightgoldenrodyellow')

ax1 = fig.add_axes([0.1, 0.3, 0.4, 0.4]) # 创一个axes对象,从(0.1,0.3)的位置开始,宽和高都为0.4,
rect = ax1.patch   # ax1的矩形设为灰色
rect.set_facecolor('lightslategray')

for label in ax1.xaxis.get_ticklabels():
    # 调用x轴刻度标签实例,是一个text实例
    label.set_color('red') # 颜色
    label.set_rotation(45) # 旋转角度
    label.set_fontsize(16) # 字体大小

for line in ax1.yaxis.get_ticklines():
    # 调用y轴刻度线条实例, 是一个Line2D实例
    line.set_color('green')    # 颜色
    line.set_markersize(25)    # marker大小
    line.set_markeredgewidth(2)# marker粗细

4.Tick 容器

matplotlib.axis.Tick 是从 FigureAxesAxisTick 中最末端的容器对象。Tick 包含了 tickgrid line 实例以及对应的 label

所有的这些都可以通过 Tick 的属性获取,常见的 tick 属性有 :

  • Tick.tick1lineLine2D 实例
  • Tick.tick2lineLine2D 实例
  • Tick.gridlineLine2D 实例
  • Tick.label1Text 实例
  • Tick.label2Text 实例

其中,y 轴分为左右两个,因此 tick1 对应左侧的轴;tick2 对应右侧的轴。
x 轴分为上下两个,因此 tick1 对应下侧的轴;tick2 对应上侧的轴。

下面的例子展示了,如何将 Y 轴右边轴设为主轴,并将标签设置为美元符号且为绿色:

fig, ax = plt.subplots()
ax.plot(100*np.random.rand(20))

# 设置ticker的显示格式
formatter = matplotlib.ticker.FormatStrFormatter('$%1.2f')
ax.yaxis.set_major_formatter(formatter)

# 设置ticker的参数,右侧为主轴,颜色为绿色
ax.yaxis.set_tick_params(which='major', labelcolor='green',
                         labelleft=False, labelright=True);

思考题

  • primitives 和 container的区别和联系是什么,分别用于控制可视化图表中的哪些要素

    • container 是容器,可以理解为一个盒子,用来盛放 Axis 坐标轴、Axes 坐标系 和 Figure 图形;
    • primitives 表示基本要素,包括 Line2D, Rectangle, Text, AxesImage 这些基本的绘图要素。

    它们之间的关系是使用 Figure 容器创建一个或多个 Axis 坐标轴容器或者 Subplot 实例,然后用 Axes 坐标轴实例的帮助方法创建 primitives要素。接下来,我们用一个例子来演示。

  • 使用提供的drug数据集,对第一列yyyy和第二列state分组求和,画出下面折线图。PA加粗标黄,其他为灰色。
    图标题和横纵坐标轴标题,以及线的文本暂不做要求。

img

  • 分别用一组长方形柱和填充面积的方式模仿画出下图,函数 y = -1 * (x - 2) * (x - 8) +10 在区间[2,9]的积分面积
    img
    img

参考资料

1. matplotlib设计的基本逻辑

2. AI算法工程师手册

表示基本要素,包括 Line2D, Rectangle, Text, AxesImage 这些基本的绘图要素。

它们之间的关系是使用 Figure 容器创建一个或多个 Axis 坐标轴容器或者 Subplot 实例,然后用 Axes 坐标轴实例的帮助方法创建 primitives要素。接下来,我们用一个例子来演示。

  • 使用提供的drug数据集,对第一列yyyy和第二列state分组求和,画出下面折线图。PA加粗标黄,其他为灰色。
    图标题和横纵坐标轴标题,以及线的文本暂不做要求。

img

  • 分别用一组长方形柱和填充面积的方式模仿画出下图,函数 y = -1 * (x - 2) * (x - 8) +10 在区间[2,9]的积分面积
    img
    img

参考资料

1. matplotlib设计的基本逻辑

2. AI算法工程师手册

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用tkinter库来设置Python GUI中的字体大小。以下是一个简单的示例代码: ```python import tkinter as tk root = tk.Tk() # 设置字体 my_font = ("Helvetica", 16) # 创建标签并设置字体 label = tk.Label(root, text="Hello World!", font=my_font) label.pack() root.mainloop() ``` 在上面的代码中,我们使用`my_font`变量定义了一个字体,然后将其用于创建标签。你可以根据自己的需要更改字体名称和大小。 ### 回答2: Python中的fontsize是指字体的大小。在Python中,我们可以使用各种方法来设置和控制字体的大小。 在Python的图形用户界面(GUI)库中,例如Tkinter和PyQt,我们可以使用相关的函数和方法来设置文本的字体大小。可以使用类似于font.size或font.configure函数来设置字体的大小。 在使用Python进行文本处理时,可以使用字符串的相关方法来设置字体大小。例如,我们可以使用字符串的format方法和HTML标签来设置HTML文档中的字体大小。 另外,Python还提供了各种绘图库,例如Matplotlib和Seaborn,可以用于在图表中设置字体的大小。这些库通常会提供相应的API或参数来设置图表中文本的字体大小。 总而言之,通过使用Python的相关库和函数,我们可以基于不同的应用场景和需求来设置和控制字体的大小。无论是在GUI应用程序中设置文本的字体大小,还是在文本处理中设置文本的字体大小,或者在绘图中设置图表的字体大小,Python提供了丰富的功能和选项。 ### 回答3: Python中可以使用matplotlib库来设置字体大小。可以通过设置figure对象和axes对象的属性来改变字体大小。具体的代码如下所示: ```python import matplotlib.pyplot as plt # 创建一个图形对象 fig = plt.figure() # 在图形对象上创建一个子图对象 ax = fig.add_subplot(111) # 在子图对象上绘制一个文本 ax.text(0.5, 0.5, 'Hello World!', fontsize=14) # 设置子图对象的字体大小 ax.set_title('Title', fontsize=16) ax.set_xlabel('X Label', fontsize=12) ax.set_ylabel('Y Label', fontsize=12) # 显示图形 plt.show() ``` 在上述代码中,我们通过调用`text`函数在子图对象上绘制了一个文本,并通过`fontsize`参数设置了字体大小为14。然后使用`set_title`、`set_xlabel`和`set_ylabel`方法设置了子图对象的标题、x轴和y轴的标签的字体大小。 除了使用matplotlib库之外,还可以使用其他的库来设置字体大小,比如tkinter库中的Label控件、pygame库中的font模块等。不同库的具体用法可能会有所差异,但都提供了相应的接口来改变字体大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值