数据可视化笔记 Task2 - Artist“艺术画笔”(二)

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  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值