Task2前文链接:数据可视化笔记 Task2 - Artist“艺术画笔”(一)
本文接上次Artist笔记,对Artist的其中一种类型primitive进行学习。
primitive - 基本元素
primitive代表了标准图形对象,主要类型有:Line2D(曲线)、Rectangle(矩形)、Text(文本)、Polygon(多边形)、image(图像)等,本次笔记主要学习primitive。
Line2D
matplotlib.lines.Line2D是matplotlib中绘制各种曲线的主要类,该类可绘制的曲线可以是实线,也可以是虚线,甚至无线(仅标记顶点)。该类构造函数及其常用参数如下(全部参数见官网源API文档):
class matplotlib.lines.Line2D(
xdata, # line上点的x轴取值,默认为range(1,len(ydata)+1)
ydata, # line上点的y轴取值
# xdata,ydata都是一维数组,元素对应,每对元素是曲线上一点
linewidth=None, # 线条宽度
linestyle=None, # 线形
color=None, # 线条颜色
marker=None, # 点的标记(形状,如"."代表点状,"v"代表倒三角状)
markersize=None # 点标记的大小
)
设置line2D的属性
下面是设置line2D相关属性的三种方法的代码:
import matplotlib.pyplot as plt # 1) 直接在plot()函数中设置 x = range(0,5) y = [2,5,7,8,10] plt.plot(x,y, linewidth=5, color='black'); # x,y元素两两对应,分别表示折线上的点, # linewidth设置线粗为10 # 2) 通过获得line对象,对line对象进行设置 x = range(0,5) y = [2,5,7,8,10] line, = plt.plot(x, y, '-', linewidth=5, color='y') # 这里等号坐标的line,是一个列表解包的操 # 作,目的是获取plt.plot返回列,表中的Line2D对象 # 3) 获得line属性,使用setp()函数设置 x = range(0,5) y = [2,5,7,8,10] lines = plt.plot(x, y) plt.setp(lines, color='r', linewidth=5); # 设置line的颜色及粗细
结果如下:
绘制line
绘制曲线的方法主要有两种,代码如下:
# 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, color='red') ax.plot(x, y2, color='orange') print(ax.lines) # 通过直接使用辅助方法画线,打印ax.lines后可以看到在matplotlib在底层创建了两个Line2D对象 # 2) Line2D对象绘制 from matplotlib.lines import 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, color='red'), Line2D(x, y2, color='orange')] # 显式创建Line2D对象 for line in lines: ax.add_line(line) # 使用add_line方法将创建的Line2D添加到子图中 ax.set_xlim(0, 4) # 设置x轴坐标范围 ax.set_ylim(2, 11) # 设置y轴坐标范围
结果如下:
【注】 绘制误差折线图
pyplot模块的
errorbar是
专门绘制误差折线图,其构造函数的主要参数如下:Axes.errorbar( x, y, # 线上点的横纵坐标值 yerr=None, xerr=None, # y轴、x轴误差大小 fmt='', # 数据点/线的格式(颜色、形状、线条风格) ecolor=None, # 指定误差条的颜色 elinewidth=None # 误差条宽度 )
具体示例见官方文档 → errorbar
Patches
该模块包含众多图形接口(二维)以及其特效(如给饼图加阴影: matplotlib.patches.Shadow实例),官网对该模块的介绍是“Patches are Artists with a face color and an edge color”。Patches模块的主类是matplotlib.patches.Patch,该类是其他许多图形类的父类。
Patch模块构成如下图(来源:官网Patches):
从图中各类的名字可以看出,其中有不少是在我们作图中经常会用到的图形,比如Polygon(多边形)、Rectangle(矩形)、Wedge(楔形)、Ellipse(椭圆形)、Annulus(环)等。这里选择其中一些最常用的进行学习:
Rectangle
矩形是我们生活中常见的形状之一,在统计分析中也是常用图形的组成部分,最典型的就是直方图(hist)与条形图(bar)。通过Rectangle类可以实现这两种图的绘制[1]。
条形图可以看做是直方图的基础,此处对使用rectangle绘制条形图进行笔记:
# 绘制简单条形图 x = [n * 10 for n in range(10)] # 生成X轴区间 y = np.random.randint(0,10,16) # 随机生成y轴数据 fig = plt.figure() ax1 = fig.add_subplot(111) for i in range(10): rect = plt.Rectangle((x[i], 0), 10, y[i]) # 绘制条块 ax1.add_patch(rect) ax1.set_xlim(0, 100) ax1.set_ylim(0, 16)
该代码运行结果如下:
![]()
Matplotlib可以便捷地制作条形图和直方图,如另一种作直方图更容易的方法是用hist进行绘制,样例可参考官网:Histograms,更多样例及矩形类详解参考:Rectangle。
Polygon
该类实现通用多边形。其构造函数如下:
matplotlib.patches.Polygon( xy, # 多边形顶点,N×2的numpy array closed=True, # 设置多边形起点与终点是否重合,为True则重合 **kwargs )
该类详解及样例代码见:官网Polygon
利用polygon类绘制多边形如下(代码参考来源:官方文档polygon样例):
from matplotlib.patches import Polygon y, x = np.mgrid[:5, 1:6] poly_coords = [ (0.25, 2.75), (3.25, 2.75), (2.25, 0.75), (0.25, 0.75) ] fig, ax = plt.subplots(ncols=1) # 创建画布及一个作图区域 # 绘制多边形 ax.add_patch(Polygon(poly_coords, color='forestgreen', alpha=0.5)) ax.margins(x=0.1, y=0.05) plt.show()
绘制多边形如下:
该类中常用的是fill类,它是基于xy绘制一个填充的多边形,fill()的定义如下:
matplotlib.pyplot.fill(*args, data=None, **kwargs)
# 用fill来绘制三角函数变体图形 x = np.linspace(0, 5 * np.pi, 1000) y = np.cos(2 * x) plt.fill(x, y, color = "g", alpha = 0.3)
Wedge
楔形是由楔子演变而来的一种数学形状,在这里主要是指扇形,该类构造函数为:
matplotlib.patches.Wedge(center, r, theta1, theta2, width=None, **kwargs)
这里一个Wedge以坐标x,y为中心(参数center),半径为r,扫过角度从θ1扫到θ2(单位:度)。
官方文档给出了该类的使用样例:Circles, Wedges and Polygons
这次教程中的代码示例[1]:
from matplotlib.collections import PatchCollection from matplotlib.patches import 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)
而一般绘制饼图更常用的是pie(),该函数主要参数如下:
matplotlib.pyplot.pie( x, # 扇区尺寸,一维数组 explode=None, # 指定用于偏移每个扇区半径的分数 labels=None, # 设置每个扇区的标记 colors=None, # 设置颜色,为序列形式,各扇区循环使用 shadow=False, # 添加阴影 labeldistance=1.1, # 标签径向距离 )
官方文档饼图样例:Labeling a pie and a donut
collections
该模块用于高效绘制大型对象集合,collections类有许多不同子类,对应不同图形的集合子类。该模块的结构图示如下(来源:matplotlib collections):
集合对应的图最直观的就是散点图,散点图由scatter方法实现,主要参数如下:
Axes.scatter(
x, y, # 点的横坐标序列与纵坐标序列
s=None, # 尺寸
c=None, # 颜色
marker=None # 标记形状
)
# 散点图样例
x = [0,2,4,6,8,10]
y = np.random.randint(0,20,6)
plt.scatter(x, y, s=50, marker='v')
images
顾名思义,该类是绘制image图像的类,其构造函数为AxesImage()。另一个常用的绘制图像的函数为imshow()。下面引用官方文档的例子imshow()样例:
# 绘制一张像素图
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('_mpl-gallery-nogrid')
# make data
X, Y = np.meshgrid(np.linspace(-3, 3, 16), np.linspace(-3, 3, 16))
Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2)
# plot
fig, ax = plt.subplots()
ax.imshow(Z)
plt.show()
到这里教程中所列举的常用primitive就学习完了,后面学习对象容器Object container。
后续笔记见(更新中):
参考资料
[1] Datawhale数据可视化开源小组. Fantastic-Matplotlib, 第二回:艺术画笔见乾坤.
[2] Matplotlib 3.5.1 Documentation——Tutorials-Artist tutorial