可视化之路(四)Line2D类详解

Line2D 类概述

以下是 matplotlib 库中的继承图:

可视化之路(四)Line2D类详解

Line2D 类继承自 matplotlib.artist.Artist 类。是 matplotlib 中专门负责画布中线条绘制的类,以下是官方文档中对 Line2D 类的说明:

A line – the line can have both a solid linestyle connecting all the vertices, and a marker at each vertex. Additionally, the drawing of the solid line is influenced by the drawstyle, e.g., one can create “stepped” lines in various styles.

——matplotlib 官方文档

Line2D 类的定义如下:

class Line2D(Artist):

    def __init__(self, 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
                 ):

参数说明如下:

  • 参数 1:xdata:指定 Line2D 实例中点的 X 轴坐标;
  • 参数 2:ydata:指定 Line2D 实例中点的 Y 轴坐标;
  • 参数 3:linewidth:指定 Line2D 实例线条宽度,单位英寸;
  • 参数 4:linestyle:指定 Line2D 实例线条风格,可以指定风格名称,也可以使用标准格式进行设置 (offset, (on, off), ...),其中 offset 表示跳过最初几个点,on 表示线条宽度,off 表示空白宽度。详情见参数详解;
  • 参数 5:color:指定 Line2D 实例线条颜色;
  • 参数 6:marker:指定 Line2D 实例线条标记点;
  • 参数 7:markersize:指定线标记点大小;
  • 参数 8:markeredgewidth:指定标记点边缘宽度;
  • 参数 9:markeredgecolor:指定标记点边缘颜色;
  • 参数 10:markerfacecolor:指定标记点颜色(不包括边缘颜色);
  • 参数 11:markerfacecoloralt:指定标记点备用颜色;
  • 参数 12:fillstyle:指定标记点填充样式;
  • 参数 13:antialiased:布尔型,指定是否使用抗锯齿渲染;
  • 参数 14:dash_capstyle:指定在虚线情况下,未闭合线的两个端点的样式;
  • 参数 15:solid_capstyle:指定在实线情况下,未闭合线的两个端点的样式;
  • 参数 16:dash_joinstyle:指定在虚线的情况下,两条线段的连接样式;
  • 参数 17:solid_joinstyle:指定在实线的情况下,两条线段的连接样式;
  • 参数 18:pickradius:指定用于密闭性测试的拾取半径;
  • 参数 19:drawstyle:指定 Line2D 实例的线条绘制样式;
  • 参数 20:markevery:指定 markevery 属性以在使用标记点时对图进行子采样;

参数详解

标记点(marker)

Marker 参数用来指定标记点样式。标记点一共分为两类,第一类是未填充标记点,第二类是完全填充标记。未填充标记点是单色的,而完全填充标记点不是单色的,他们都可以使用一个符号进行设置。完全填充标记点可以使用多种颜色,可以指定标记点本身和其边缘的颜色,即指定 markeredgecolormarkerfacecolor 两个参数,除此之外,颜色的填充还受到 fillstyle 参数的影响。

未填充标记点如下图所示:

可视化之路(四)Line2D类详解

完全填充标记点如下图所示:

可视化之路(四)Line2D类详解

除了使用一个字符设置标记点,也可以使用一个元祖进行指定,其通用格式为 numsides, typenum, angle,其中 numsides指定了标记点边的数量; typenum指定标记点的基础类型(0:整多边形,1:星型,2:星号); angle指定了符号旋转的角度,示例程序如下:


Y1 = np.random.randn(5)
Y2 = np.random.randn(5)
Y3 = np.random.randn(5)

line1 = plt.plot(Y1, marker=(5, 0, 0), markersize=15, label='marker=(5, 0, 0)')
line2 = plt.plot(Y2, marker=(5, 1, 0), markersize=15, label='marker=(5, 1, 0)')
line3 = plt.plot(Y3, marker=(5, 2, 0), markersize=15, label='marker=(5, 2, 0)')

画图结果如下:

可视化之路(四)Line2D类详解

除了上述方法,标记点样式还可以是 STIX 数学字体,也就是 Latex 字符,其通用格式为 $字符$,通过这样的方式,就可以使用特殊符号作为标记点样式。STIX 数学字体的示例程序如下:


Y1 = np.random.randn(5)
Y2 = np.random.randn(5)
Y3 = np.random.randn(5)

line1 = plt.plot(Y1, marker=r'$\alpha$', markersize=15, label='marker=alpha')
line2 = plt.plot(Y2, marker=r'$\beta$', markersize=15, label='marker=beta')
line3 = plt.plot(Y3, marker='$f$', markersize=15, label='marker=f')

画图结果如下:

可视化之路(四)Line2D类详解

Fillstyle(填充模式)

该参数主要是针对 完全填充标记点,作用在于指定内部的填充模式。简单来说就是使用 markerfacecoloraltmarkerfacecolor的颜色填充标记点的一半,根据 fillstyle 参数的不同,一半可能指上下,也可能指左右。其示例代码如下:


figure = plt.figure(1, figsize=(15, 15))
ax1 = figure.add_subplot(2, 3, 1)
ax2 = figure.add_subplot(2, 3, 2)
ax3 = figure.add_subplot(2, 3, 3)
ax4 = figure.add_subplot(2, 3, 4)
ax5 = figure.add_subplot(2, 3, 5)
ax6 = figure.add_subplot(2, 3, 6)

Y1 = np.random.randn(5)
Y2 = np.random.randn(5)
Y3 = np.random.randn(5)

line1 = ax1.plot(Y1, marker='o', markersize=15, markerfacecolor='#FF0000', markerfacecoloralt='#00FF00', fillstyle='full', label='fillstyle=full')
ax1.set_title('full', fontsize=10)
ax1.legend()

line2 = ax2.plot(Y2, marker='o', markersize=15, markerfacecolor='#FF0000', markerfacecoloralt='#00FF00', fillstyle='left', label='fillstyle=left')
ax2.set_title('left', fontsize=10)
ax2.legend()

line3 = ax3.plot(Y3, marker='o', markersize=15, markerfacecolor='#FF0000', markerfacecoloralt='#00FF00', fillstyle='right', label='fillstyle=right')
ax3.set_title('right', fontsize=10)
ax3.legend()

line4 = ax4.plot(Y3, marker='o', markersize=15, markerfacecolor='#FF0000', markerfacecoloralt='#00FF00', fillstyle='bottom', label='fillstyle=bottom')
ax4.set_title('bottom', fontsize=10)
ax4.legend()

line5 = ax5.plot(Y3, marker='o', markersize=15, markerfacecolor='#FF0000', markerfacecoloralt='#00FF00', fillstyle='top', label='fillstyle=top')
ax5.set_title('top', fontsize=10)
ax5.legend()

line6 = ax6.plot(Y3, marker='o', markersize=15, markerfacecolor='#FF0000', markerfacecoloralt='#00FF00', fillstyle=None, label='fillstyle=none')
ax6.set_title('none', fontsize=10)
ax6.legend()

画图结果如下:

可视化之路(四)Line2D类详解

Capstyle

该参数主要用来指定线的两端样式,即定义如何绘制未闭合线的两个端点。Matplotlib 提供了三种样式,分别是 buttroundprojecting(默认选项),matplotlib 的官方示例代码如下:

import matplotlib.pyplot as plt
from matplotlib._enums import CapStyle

CapStyle.demo()
plt.show()

画图结果如下:

可视化之路(四)Line2D类详解

Joinstyle

该参数主要用来指定两条线段的连接方式,Matplotlib 提供了三种样式,分别是 miterround(默认)和 bevel。matplotlib 的官方示例代码如下:

import matplotlib.pyplot as plt
from matplotlib._enums import JoinStyle

JoinStyle.demo()
plt.show()

画图结果如下:

可视化之路(四)Line2D类详解

drawstyle

该参数指定绘图的绘制样式,matplotlib 提供了四种选项,分别为 defaultsteps-presteps-midsteps-post。默认情况下以直线连接各个端点,即指定 default 选项或未指定任何选项,后三种将会以阶梯状线将端点相连。示例程序代码如下:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.arange(14)
y = np.sin(x / 2)

plt.plot(x, y + 3, drawstyle='default', label='default')
plt.plot(x, y + 3, 'o--', color='grey', alpha=0.3)

plt.plot(x, y + 2, drawstyle='steps-pre',label='pre')
plt.plot(x, y + 2, 'o--', color='grey', alpha=0.3)

plt.plot(x, y + 1, drawstyle='steps-mid', label='mid')
plt.plot(x, y + 1, 'o--', color='grey', alpha=0.3)

plt.plot(x, y, drawstyle='steps-post', label='post')
plt.plot(x, y, 'o--', color='grey', alpha=0.3, label='normal')

plt.grid(axis='x', color='0.95')
plt.legend(title='Parameter where:')
plt.title('drawstyle参数')
plt.show()

画图结果如下:

可视化之路(四)Line2D类详解

Linestyle(线条样式)

该参数用来设置线的线型,设置时有两种方式,第一种是直接传递线型名称,例如传递 linestyle='solid。第二种方式更加通用,其标准格式为 (offset, (on, off), ...),其中 offset 表示跳过最初几个点,on 表示线条宽度,off 表示空白宽度。例如(0, (5, 10))表示先画 5pt 的线条然后画 10pt 的空格,循环持续下去。其示例代码如下:

import numpy as np
import matplotlib.pyplot as plt

linestyle_str = [
     ('solid', 'solid'),
     ('dotted', 'dotted'),
     ('dashed', 'dashed'),
     ('dashdot', 'dashdot')]

linestyle_tuple = [
     ('loosely dotted',        (0, (1, 10))),
     ('dotted',                (0, (1, 1))),
     ('densely dotted',        (0, (1, 1))),

     ('loosely dashed',        (0, (5, 10))),
     ('dashed',                (0, (5, 5))),
     ('densely dashed',        (0, (5, 1))),

     ('loosely dashdotted',    (0, (3, 10, 1, 10))),
     ('dashdotted',            (0, (3, 5, 1, 5))),
     ('densely dashdotted',    (0, (3, 1, 1, 1))),

     ('dashdotdotted',         (0, (3, 5, 1, 5, 1, 5))),
     ('loosely dashdotdotted', (0, (3, 10, 1, 10, 1, 10))),
     ('densely dashdotdotted', (0, (3, 1, 1, 1, 1, 1)))]

def plot_linestyles(ax, linestyles, title):
    X, Y = np.linspace(0, 100, 10), np.zeros(10)
    yticklabels = []

    for i, (name, linestyle) in enumerate(linestyles):
        ax.plot(X, Y+i, linestyle=linestyle, linewidth=1.5, color='black')
        yticklabels.append(name)

    ax.set_title(title)
    ax.set(ylim=(-0.5, len(linestyles)-0.5),
           yticks=np.arange(len(linestyles)),
           yticklabels=yticklabels)
    ax.tick_params(left=False, bottom=False, labelbottom=False)
    ax.spines[:].set_visible(False)

    for i, (name, linestyle) in enumerate(linestyles):
        ax.annotate(repr(linestyle),
                    xy=(0.0, i), xycoords=ax.get_yaxis_transform(),
                    xytext=(-6, -12), textcoords='offset points',
                    color="blue", fontsize=8, ha="right", family="monospace")

ax0, ax1 = (plt.figure(figsize=(10, 8))
            .add_gridspec(2, 1, height_ratios=[1, 3])
            .subplots())

plot_linestyles(ax0, linestyle_str[::-1], title='Named linestyles')
plot_linestyles(ax1, linestyle_tuple[::-1], title='Parametrized linestyles')

plt.tight_layout()
plt.show()

画图结果如下:

可视化之路(四)Line2D类详解

Linewidth

该参数主要指定线条宽度,单位英寸,示例代码如下:

Y1 = np.random.randn(5)
Y2 = np.random.randn(5)
Y3 = np.random.randn(5)

line1 = plt.plot(Y1, markersize=15, lw=5, label='lw=5')
line2 = plt.plot(Y2,  markersize=15, lw=10, label=' lw=10')
line3 = plt.plot(Y3,  markersize=15, lw=15, label=' lw=15')
plt.legend()

画图结果如下:

可视化之路(四)Line2D类详解

Line2D 实例属性的获取和设置

所有的属性都可以通过 get_property() 方法进行获取, set_property(value) 方法进行设置。示例程序如下:

Y = np.random.randn(5)
line = plt.plot(Y, marker=(5, 0, 0), markersize=15, label='marker=(5, 0, 0)')

print('old_markersize=', line[0].get_markersize())
line[0].set_markersize(55)
print('new_markersize=', line[0].get_markersize())

程序结果如下:

old_markersize= 15.0
new_markersize= 55.0

应用

动态画图

利用 plot() 返回的 Line2D 实例进行动态画图,使用 set_ydata() 方法进行数据更新。动态画图实例程序如下:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()

x = np.arange(0, 2*np.pi, 0.01)
line, = ax.plot(x, np.sin(x))

def animate(i):
    line.set_ydata(np.sin(x + i / 50))
    return line,

ani = animation.FuncAnimation(
    fig, animate, interval=20, blit=True, save_count=50)

plt.show()

画图结果如下:

可视化之路(四)Line2D类详解

这里有一点需要特别注意,那就是 plot() 方法的返回之时 Line2D 实例列表,而不是实例本身,哪怕只画一条线。

自定义虚线样式

line1 对象使用 Line2D 实例的 set_dashes() 方法自定义虚线样式,line2 对象则直接指定的参数,可以明显看出两者的区别。自定义虚线样式示例程序如下:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 500)
y = np.sin(x)

fig, ax = plt.subplots()

line1, = ax.plot(x, y, label='Using set_dashes()')
line1.set_dashes([2, 2, 10, 2])

line2, = ax.plot(x, y - 0.2, dashes=[6, 2], label='Using the dashes parameter')

ax.legend()
plt.show()

画图结果如下:

可视化之路(四)Line2D类详解

文中难免会出现一些描述不当之处( 尽管我已反复检查多次),欢迎在留言区指正,相关的知识点也可进行分享,希望大家都能有所收获!!如果觉得我的文章写得还行,不妨支持一下。你的每一个转发、关注、点赞、评论都是对我最大的支持!

Original: https://blog.csdn.net/pcx171/article/details/115463467
Author: 小猪猪家的大猪猪
Title: 可视化之路(四)Line2D类详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/767711/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球