【matplotlib】可视化之路——Line2D类详解

Line2D 类概述

以下是 matplotlib 库中的继承图:
在这里插入图片描述

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,  # all Nones default to rc  
	             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 参数的影响。

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

在这里插入图片描述

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

在这里插入图片描述

除了使用一个字符设置标记点,也可以使用一个元祖进行指定,其通用格式为 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)')	#边数5,type0
line2 = plt.plot(Y2, marker=(5, 1, 0), markersize=15, label='marker=(5, 1, 0)')	#边数5,type1
line3 = plt.plot(Y3, marker=(5, 2, 0), markersize=15, label='marker=(5, 2, 0)')	#边数5,type2

画图结果如下:

在这里插入图片描述

除了上述方法,标记点样式还可以是 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')	#使用alpha符号作为标记点符号
line2 = plt.plot(Y2, marker=r'$\beta$', markersize=15, label='marker=beta')	#使用beta符号作为标记点符号
line3 = plt.plot(Y3, marker='$f$', markersize=15, label='marker=f')	#使用英文字母f符号作为标记点符号

画图结果如下:

在这里插入图片描述

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()

画图结果如下:

在这里插入图片描述

Capstyle

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

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

CapStyle.demo()	#调用官方Demo
plt.show()

画图结果如下:

在这里插入图片描述

Joinstyle

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

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

JoinStyle.demo()	#调用官方Demo
plt.show()

画图结果如下:

在这里插入图片描述

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)

#使用默认方式default
plt.plot(x, y + 3, drawstyle='default', label='default')
plt.plot(x, y + 3, 'o--', color='grey', alpha=0.3)	#正常画图

#steps-pre参数,阶梯在前
plt.plot(x, y + 2, drawstyle='steps-pre',label='pre')
plt.plot(x, y + 2, 'o--', color='grey', alpha=0.3)	#正常画图

#steps-mid参数,阶梯在中间
plt.plot(x, y + 1, drawstyle='steps-mid', label='mid')
plt.plot(x, y + 1, 'o--', color='grey', alpha=0.3)	#正常画图

#steps-post,阶梯在后
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()

画图结果如下:

在这里插入图片描述

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'),      # 同 (0, ()) or '-'
     ('dotted', 'dotted'),    # 同 (0, (1, 1)) or '.'
     ('dashed', 'dashed'),    # 同 as '--'
     ('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()

画图结果如下:

在这里插入图片描述

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 实例属性的获取和设置

所有的属性都可以通过 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())	#获取当前的markersize大小
line[0].set_markersize(55)	#更改markersize大小为55
print('new_markersize=', line[0].get_markersize())	#获取更改后的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))  # update the data.
    return line,

#开始动画
ani = animation.FuncAnimation(
    fig, animate, interval=20, blit=True, save_count=50)

plt.show()

画图结果如下:

动态画图展示

这里有一点需要特别注意,那就是 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()

#画第一条线,使用set_dashes方法
line1, = ax.plot(x, y, label='Using set_dashes()')
line1.set_dashes([2, 2, 10, 2])  #2点+2空位+10点+2空位

#画第二条线,直接指定参数
line2, = ax.plot(x, y - 0.2, dashes=[6, 2], label='Using the dashes parameter')

ax.legend()
plt.show()

画图结果如下:

在这里插入图片描述

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

  • 15
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猪猪家的大猪猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值