Python图像可视化基础二

设置刻度、刻度标签和网格

matplotlib 中,调用 figure() 会显式地创建一个图形,表示一个图形用户界面窗口。通过调用 plot() 或类似的方法会隐式地创建图形。这对于简单的图表没有问题,但是对于更高级的应用,能显示创建图形并得到实例的引用是非常有用的。

一个图形包括一个或多个子区。子区能以规则网格的方式排列 plot。我们已经使用过 subplot() 方法,在调用时指定所有 plot 的行数和列数以及要操作的 plot 的序号。

如果需要更多的控制,我们需要使用 matplotlib.axes.Axes 类的坐标轴实例。这样可以把 plot 放置在图形窗口中的任意位置,例如可以把一个小的 plot 放在一个大的 plot 中。

操作步骤

刻度是图形的一部分,由刻度定位器(tick locator)—— 指定刻度所在的位置——和刻度格式器(tick formatter)—— 指定刻度显示的样式 —— 组成。刻度有主刻度(major ticks)和次刻度(minor ticks),默认不显示次刻度。更重要的是,主刻度和次刻度可以被独立地指定位置和格式化。

我们可以使用 matplotlib.pyplot.locator_params() 方法控制刻度定位器的行为。尽管刻度位置通常会自动被确定下来,我们还是可以控制刻度的数目,以及在 plot 比较小时使用一个紧凑视图(tight view)。

import matplotlib.pyplot as plt
import numpy as np

# 获取当前的坐标轴
ax = plt.gca()

# 将视图设置为紧密,并将最大刻度间隔数设置为10
ax.locator_params(tight=True, nbins = 10)

# 生成100个正态分布值
ax.plot(np.random.normal(10,.1,100))

plt.show()

在这里插入图片描述

一个使用dates模块的例子

其中 pylabmatplotlib 面向对象绘图库的过程接口。matplotlib 是整个包;
matplotlib.pyplotmatplotlib 中的一个模块;它和pylab 是一个与 matplotlib 一起安装的模块。
pylab 是一个非常方便模块,可以在单个名称空间中批量导入 matplotlib.pyplot (用于绘图)和 numpy (用于数学和使用数组)。
在实际的使用场景下,推荐直接 import matplotlib.pyplotimport numpy,不推荐 import pylab

from pylab import *
import matplotlib as mpl
import datetime

fig = figure()

# 获取当前得坐标轴
ax = gca()

# 设置一些时间范围
start = datetime.datetime(2013, 1, 1)
stop = datetime.datetime(2013, 12, 31)
delta = datetime.timedelta(days = 1)

# 将日期转化成为 matplotlib 格式的时间数据
dates = mpl.dates.drange(start, stop, delta)

# 随机生成一些数据
values = np.random.rand(len(dates))

# 用时间数据来绘制图像
ax.plot_date(dates, values, linestyle='-', marker='')

# 指定时间的格式
date_format = mpl.dates.DateFormatter('%Y-%m-%d')

# 应用时间的格式
ax.xaxis.set_major_formatter(date_format)

# 自动设置日期标签格式
# 默认情况下,将标签旋转 30 度
# 使用 rotate 这个参数指定不同的旋转度
# 使用 bottom 这个参数为日期标签提供更多空间
fig.autofmt_xdate()

show()

在这里插入图片描述


添加图例和注解

from matplotlib.pyplot import *

# 生成不同的正态分布
# 第一个参数loc(分布的均值)第二个参数scale(分布的标准差),第三个参数(输出值的维度)
x1 = np.random.normal(30, 3, 100)
x2 = np.random.normal(20, 2, 100)
x3 = np.random.normal(10, 3, 100)

# 将它们绘制出来
plot(x1, label='plot')
plot(x2, label='2nd plot')
plot(x3, label='last plot')

# 生成一个图例框
# bbox_to_anchor:从(0,1.02)开始,宽度为1,高度为0.102;
# loc设置图例显示的位置;ncol设置列的数量
# borderaxespad表示坐标轴和图例边框之间的距离
# 参数 mode 可以设置为 None 或者 expand,当为 expand 时,图例框会水平扩展至整个坐标轴区域。
legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3,
       ncol=3, mode="expand", borderaxespad=0.)

# 标注一个重要的值
# 通过设置 `xycoord = 'data',可以指定注解和数据使用相同的坐标系。
# 注解文本的起始位置通过xytext指定。
# 箭头由 xytext 指向 xy 坐标位置。arrowprops 字典中定义了很多箭头属性。
# arrowstyle 来指定箭头的风格
annotate("Important value", (55,20), xycoords='data', xytext=(5, 38), 
          arrowprops=dict(arrowstyle='->')) 
show()

在这里插入图片描述
我们所做的是为每个 plot 指定了一个字符串标签,这样 legend() 会把它们添加到图例框中。
我们通过指定 loc 参数确定图例框的位置。这个参数是可选的,但是为了不让图例框覆盖图表中的线,我们想为其指定一个位置。

工作原理

  • 位置参数
字符串数值字符串数值
upper right1center left6
upper left2center right7
lower left3lower center8
lower right4upper center9
right5center10

如果不想再图例中显示标签,可以将标签设置为nolegend


移动轴线到图中央

轴线定义了数据区域的边界,把坐标轴刻度标记连接起来。
一共有四个轴线,可以把它们放置在任何位置。
默认情况下,它们被放置在坐标轴的边界,因此我们会看到数据图表有一个框。

操作步骤

为了把轴线移到图中央,需要把其中两个轴线隐藏起来(设置 color 为 none )。
然后,移动另外两个到坐标 (0, 0)。坐标为数据空间坐标。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-np.pi, np.pi, 500, endpoint=True) 
y = np.sin(x)

plt.plot(x, y)

ax = plt.gca()

# 将右边和顶部的轴隐藏起来
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 将底部和左边的轴移动到 0 的位置
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))

# 将刻度移动到对应的位置
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')

plt.show()

在这里插入图片描述

补充说明

轴线可以被限制在数据结束的地方结束,例如调用 set_smart_bounds(True)。在这种情况下,matplotlib 会尝试以一种复杂的方式设置边界,例如处理颠倒的界限,或者在数据延伸出视图的情况下裁剪线条以适应视图。


绘制直方图

  • 直方图被用于可视化数据的分布估计。

  • 表示一定间隔下数据点频率的垂直矩形称为 bin
    bin 以固定的间隔创建,因此直方图的总面积等于数据点的数量。

  • 直方图可以显示数据的相对频率,而不是使用数据的绝对值。在这种情况下,总面积就等于 1。

  • 直方图经常被用在图像处理软件中,作为可视化图像属性(如给定颜色通道上光的分布)的一种方式。

  • 这些图像直方图进一步可以应用在计算机视觉算法来检测峰值,用来辅助进行边缘检测、图像分割等。

计算bin数量

最简单的一个是基于上取整( ceiling )函数,这时 bins(k) 等于 ceiling (max(x) - min(x) / h),其中 x 是绘制的数据集合,h 为期望的 bin 宽度。
这只是一种选项,因为正确显示数据的 bin 数量取决于真实的数据分布。

操作步骤

如果调用 matplotlib.pyploy.hist() 来创建直方图,我们需要传入一些参数,下面是一些最重要的参数。

  • bins:可以是一个 bin 数量的整数值,也可以是表示 bin 的一个序列。默认值为 10。
  • range:bin 的范围,当 bins 参数为序列时,此参数无效。范围外的值将被忽略掉,默认值为 None。
  • normed:如果值为 True,直方图的值将进行归一化( normalized )处理,形成概率密度。默认值为 False。
  • histtype:默认为 bar 类型的直方图。其他选项有以下几个:
    • barstacked:用于多种数据的堆叠直方图。
    • step:创建未填充的线形图。
    • stepfilled:创建默认填充的线形图。histtype 的默认值为 bar。
  • align:用于 bin 边界之间矩形条的居中设置。默认值为 mid,其他值为 left 和 right。
  • color:指定直方图的颜色。可以是单一颜色值或者颜色的序列。如果指定了多个数据集合,颜色序列将会设置为相同的顺序。如果未指定,将会使用一个默认的线条颜色。
  • orientation:通过设置 orientation 为 horizontal 创建水平直方图。默认值为 vertical。

举例:

import numpy as np
import matplotlib.pyplot as plt

mu = 100
sigma = 15
# 生成正态分布数据
x = np.random.normal(mu, sigma, 10000)

ax = plt.gca()

# 数据的直方图
ax.hist(x, bins=35, color='r')

ax.set_xlabel('Values')
ax.set_ylabel('Frequency')

ax.set_title(r'$\mathrm{Histogram:}\ \mu=%d,\ \sigma=%d$' % (mu, sigma))

plt.show()

在这里插入图片描述


绘制误差条形图

  • 可以用误差条来可视化数据集合中的测量不确定度( uncertainty of measurement )或者指出错误。误差条可以很容易地表示误差偏离数据集合的情况。

  • 它们可以显示一个标准差( standard deviation )、一个标准误差( standard error )或者 95% 的置信区间( confidence interval )。

  • 因为在表示上没有统一标准,所以总是需要显式地表明误差条显示的是哪一种值(误差)。实验科学( experimental sciences )领域的大多数论文都应该在描述数据精度的时候包含误差条。

操作步骤

必选参数:left和height
其他参数:

  • width:给定误差条的宽度,默认值为0.8
  • bottom:如果指定了bottom,其值会加到高度中,默认值为None
  • edgecolor:给定误差条边界颜色
  • ecolor:指定误差条的颜色
  • linewidth:误差条边界宽度,可以设为None(默认值)和0(此时误差条边界将不显示)

一些可选参数( color、edgecolor、linewidth、xerr 和 yerr )可以是单一值,也可以是和误差条数目相同长度的序列。

import numpy as np
import matplotlib.pyplot as plt

# 从高斯分布中生成度量值
x = np.arange(0, 10, 1)

# 从度量值中计算出 y 值
y = np.log(x)

# 从标准正太分布中生成一些误差
xe = 0.1 * np.abs(np.random.randn(len(y)))

# draw and show errorbar
plt.bar(x, y, yerr=xe, width=0.4, align='center', ecolor='r', color='cyan',
                                                    label='experiment #1');

# 添加解释性数据
plt.xlabel('# measurement')
plt.ylabel('Measured values')
plt.title('Measurements')
plt.legend(loc='upper left')

plt.show()

在这里插入图片描述

阴影线的值:

阴影线的值描述阴影线的值描述
/斜线x交叉线
\反斜线o小圆圈
|垂直线O大圆圈
-水平线.
+十字线*星号
补充说明
  • 上文刚用到的误差条叫作对称误差条。如果数据集合的性质是误差在两个方向上(正向和负向)不同,也可以用非对称误差条来表示。

  • 非对称误差条必须用一个两个元素的列表(比如一个二维数组)来指定 xerr 和 yerr,其中第一个列表包含负向误差的值,第二个包含正向误差的值。


绘制饼图

import matplotlib.pyplot as plt

# 饼图在正方形图中看起来效果最好
# 如果在长方形图中则看起来像椭圆
# 设置标题大小
plt.rcParams.update({'font.size': 15})

plt.figure(1, figsize=(8, 8))
ax = plt.axes([0.1, 0.1, 0.8, 0.8])

# 每一部分将按逆时针顺序排列和绘制。
labels = 'Spring', 'Summer', 'Autumn', 'Winter'
values = [15, 16, 16, 28]
explode = [0.1, 0.1, 0.1, 0.1]

# 绘制饼图
# explode:指定饼图某些部分的突出显示,即呈现爆炸式。
# labels:为饼图添加标签说明,类似于图例说明。
# colors:指定饼图的填充色。
# autopct:自动添加百分比显示,可以采用格式化的方法显示。
# startangle:设置饼图的初始摆放角度。 
plt.pie(values, explode=explode, labels=labels,
    autopct='%1.1f%%', startangle=67)

plt.title('Rainy days by season')

plt.show()

在这里插入图片描述

饼图pie函数参数详解

工作原理

  • 饼图如果绘制在一个正方形的图表中并且有正方形的坐标轴,看上去会非常漂亮。

  • 饼图的每部分定义为 x / sum(x)。通过给定一个分裂序列,可以获得分裂的效果,其中每一个元素表示每个圆弧间偏移量,为半径的百分比。

  • autopct 参数来格式化绘制在圆弧中的标签,标签可以是一个格式化字符串或者是一个可调用的对象(函数)。

  • 我们也可以使用一个布尔值的阴影参数给饼图添加阴影效果。

  • 如果没有指定 startangle,扇区将从 x 轴(角度 0 )开始逆时针排列;

  • 如果指定 atartangle 的值为 90,饼图将从 y 轴开始。


绘制带填充区域的图标

填充两个轮廓线之间的区域:

from matplotlib.pyplot import figure, show, gca
import numpy as np

# 生成 x 的值
x = np.arange(0.0, 2, 0.01)

# y1 和 y2 代表两个不同的信号
y1 = np.sin(2*np.pi*x)
y2 = 1.2*np.sin(4*np.pi*x)

fig = figure()
ax = gca()

# 填充 y1 和 y2 中间部分
ax.plot(x, y1, x, y2, color='black')
# fill_between() 方法使用 x 为定位点选取 y 值 (yl, y2),然后用几种预定义的颜色绘制出多边形。
# 用 where 参数指定一个条件来填充曲线,where 参数接受布尔值(可以是表达式),这样就只会填充满足 where 条件的区域。
ax.fill_between(x, y1, y2, where=y2>=y1, facecolor='darkblue', interpolate=True)
ax.fill_between(x, y1, y2, where=y2<=y1, facecolor='deeppink', interpolate=True)

ax.set_title('filled between')

show()

在这里插入图片描述

补充说明

  • fill_between() 方法也接收许多参数,比如 hatch(指定填充的样式替代颜色)和线条选项( linewidth 和 linestyle )。

  • 另外一个方法是 fill_betweenx(),该方法有相似的填充特性,但是它是针对水平曲线的。

  • 更通用的 fill() 方法提供了对任意多边形填充颜色或者阴影线的功能。


绘制带彩色标记的散点图

  • 散点图显示两组数据的值。数据可视化的工作由一组并不由线条连接的点完成。
  • 每个点的坐标位置由变量的值决定。一个变量是自变量(或称为无关变量,independent variable ),另一个是应变量(或称为相关变量,dependent variable )。因变量通常绘制在 y 轴上。
import matplotlib.pyplot as plt
import numpy as np

# 随机生成标准正态分布的 x 值
x = np.random.randn(1000)

# 随机生成标准正态分布的 y1 值,同 x 没有关联
y1 = np.random.randn(len(x))

# 生成 y2 的值,同 x 有关联
y2 = 1.2 + np.exp(x)

# 绘制 x-y1,不相关数据
ax1 = plt.subplot(121)
plt.scatter(x, y1, color='indigo', alpha=0.3, edgecolors='white', label='no correl')
plt.xlabel('no correlation')
plt.grid(True)
plt.legend()

# 绘制 x-y2,强正相关数据
ax2 = plt.subplot(122, sharey=ax1, sharex=ax1)
plt.scatter(x, y2, color='green', alpha=0.3, edgecolors='grey', label='correl')
plt.xlabel('strong correlation')
plt.grid(True)
plt.legend()

plt.show()

在这里插入图片描述
散点图通常在应用拟合回归函数之前绘制,用来识别两个变量间的关联。它很好地呈现了相关性的视觉画面,尤其是对于非线性关系的数据。
matplotlib 提供的 scatter() 函数用来绘制与 x 相同长度的一维数组( unidimensional array )y 的散点图。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值