【学习笔记】python数据可视化之matplotlib实践第六章

划分画布的主要函数

(1)subplot():绘制网格区域中的几何形状相同的子区布局

subplot(c,r,p):表示在c行,r列的布局上,子区subplot()会被放置在p位置上;也可以写成subplot(crp)

1.在极坐标轴上绘制折线图

import matplotlib.pyplot as plt
import numpy as np

radii = np.linspace(0,1,100)
theta = 2*np.pi*radii

ax = plt.subplot(111,polar = True)
ax.plot(theta,radii,color = 'r',linestyle = '-',linewidth = 2)

plt.show()

代码说明:通过调用subplot函数获得坐标轴实例ax,使用面向对象调用实例方法的技术完成在极坐标轴上绘制折线图的任务,其中极径和极角作为折线图的数量参数,同时还是可以设置折线图的线型、颜色和线宽等属性。 

运行结果: 

2.在极坐标轴上绘制散点图

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

radii = 30*np.random.rand(100)
theta = 2*np.pi*np.random.rand(100)
colors = np.random.rand(100)#生成0-1之间的数值作为散点的颜色值
size = 50*radii

ax = plt.subplot(111,polar = True)
ax.scatter(theta,radii,s = size,c = colors,cmap = mpl.cm.PuOr,marker = '*')#如果想要使用一个序列的值进行颜色映射就是用c而不是使用color
#cmap=mpl.cm.PuOr 使用 “PuOr” 颜色映射,这会根据 color 数组中的值自动分配颜色。
plt.show()

代码说明: 通过调用subplot函数获得坐标轴实例ax,使用面向对象调用实例方法的技术完成在极坐标轴上绘制散点图的任务。这里我们使用的颜色映射表’PuOr‘为标记着色,在后面的笔记中会更详细的讲解。

运行结果:

3.在非等分画布的绘图区域上实现图形展示

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
x = np.linspace(0.0,2*np.pi)
y = np.cos(x)*np.sin(x)

ax1 = fig.add_subplot(121)
ax1.margins(0.03)#设置子图 ax1 的边距为 0.03。边距可以控制数据点与坐标轴边界之间的距离
ax1.plot(x,y,ls = '-',lw = 2,color = 'b')

ax2 = fig.add_subplot(222)
ax2.margins(0.7,0.7)#设置子图 ax2 的边距为 0.7(在 x 和 y 方向上都为 0.7)
ax2.plot(x,y,ls = '-',lw = 2,color = 'r')

ax3 = fig.add_subplot(224)
ax3.margins(x = 0.1,y = 0.3)#设置子图 ax3 的边距,x 方向为 0.1,y 方向为 0.3
ax3.plot(x,y,ls = '-',lw = 2,color = 'g')

plt.show()

代码说明:我们使用add_subplot()函数绘制非等分画布的绘图区域的多子区折线图,左侧图形是由subplot(121)完成的,右侧上下两幅图形通过实例方法add_subplot(222)和add_subplot(224)绘制完成的。 

运行结果:

(2)subplot2grid():让子区跨越固定的网格布局

1.subplot2grid()使用方法

进行非等分画布形式的图形展示,需要向画布多次使用子区函数subplot()完成非等分画布的展示任务,但是此过程麻烦且容易出现差错,因此需要用更高级的方法subplot2grid()使用子区,需要定制化的网格区域。

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

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

plt.subplot2grid((2,3),(0,0),colspan=2)#colspan=2 表示这个子图将横跨 2 列
x = np.linspace(0.0,4.0,100)
y = np.random.randn(100)
plt.scatter(x,y,c = 'c')
plt.title('散点图')

plt.subplot2grid((2,3),(0,2))#没有设置colspan默认为1列
plt.title('空白绘制区域')

plt.subplot2grid((2,3),(1,0),colspan=3)#colspan=3 表示这个子图将横跨 3 列
x = np.linspace(0.0,4.0,100)
y1 = np.sin(x)
plt.plot(x,y1,lw = 2,ls = '-')
plt.xlim(0,3)
plt.grid(True,ls = ':',c = 'r')
plt.title('折线图')

plt.suptitle('subplot2grid()函数的实例展示',fontsize = 15)

plt.show()

代码说明:1.subplot2grid(shape,loc):将参数shape所划定的网格布局作为绘图区域,实现loc位置处的绘制图形的目的。 例如:plt.subplot2grid((2,3),(0,0),colspan=2)设置了一个2行3列的网格布局,loc=(0,0)表示图形将第一行第一列作为位置起点,colspan=2表示此图形跨越2列。

2.值得注意的是,图形位置索引是从0开始的,并不是和subplot一样是从1开始的

3.suptitle()是绘制figure画布标题的文本内容,title()是绘制坐标轴实例的图形标题的文本内容。

运行结果:

2.模块gridspec中的类GridSpec的使用方法

以下代码是在1.3的代码基础上进行修改的;

值得注意的是,在书上,作者使用了axis_bgcolor参数,我们现在使用的python3版本并不适用,但我们可以使用ax.facecolor设置背景颜色以达到相同的目的

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.gridspec import GridSpec
fig = plt.figure()
x = np.linspace(0.0,2*np.pi)
y = np.cos(x)*np.sin(x)

gs = GridSpec(2,2)
ax1 = fig.add_subplot(gs[:,0])
ax1.set_facecolor('yellowgreen')
ax1.margins(0.03)#设置子图 ax1 的边距为 0.03。边距可以控制数据点与坐标轴边界之间的距离
ax1.plot(x,y,ls = '-',lw = 2,color = 'b')

ax2 = fig.add_subplot(gs[0,1])
ax2.set_facecolor('cornflowerblue')
ax2.margins(0.7,0.7)#设置子图 ax2 的边距为 0.7(在 x 和 y 方向上都为 0.7)
ax2.plot(x,y,ls = '-',lw = 2,color = 'r')

ax3 = fig.add_subplot(gs[1,1])

ax3.margins(x = 0.1,y = 0.3)#设置子图 ax3 的边距,x 方向为 0.1,y 方向为 0.3
ax3.plot(x,y,ls = '-',lw = 2,color = 'g')

plt.show()

代码说明:1.通过 gs = GridSpec(2,2)生成了一个2行2列的实例gs

2.我们要将画布划分为2行2列的网格状几何形状,实例方法add_subplot()的参数gs[:,0]表示将第一列、全部行作为子区,参数gs的索引是从0开始的

运行结果:

(3)subplots():创建一张画布带有多个子区的绘图模式

subplots()的返回值是一个(fig,ax)元组,其中fig是figure实例,ax可以是一个axis对象,如果多个子区被创建,那么ax可以是一个axis对象数组

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

mpl.rcParams['font.sans-serif'] = ['LiSu']
mpl.rcParams['axes.unicode_minus'] = False

font_style = dict(fontsize = 18,weight = 'black')

x = np.linspace(0.0,2*np.pi,500)
y = np.exp(-x)*np.sin(x)

fig,ax = plt.subplots(1,2,sharey=True)

ax1 = ax[0]
ax1.plot(x,y,ls = '--',lw = 2,color = 'b')
ax1.set_title('折线图')

ax2 = ax[1]
ax2.scatter(x,y,ls = '-',marker = 'o',color = 'r')
ax2.set_title('散点图')

plt.suptitle('创建一张画布和两个子区的绘图模式',**font_style)
plt.show()

代码说明:1.通过调用函数subplots(1,2)生成一个画布对象和一个坐标轴实例数组,画布对象和实例数组分别存储在变量fig和ax中,然后分别在坐标轴ax1和坐标轴ax2绘制折线图和散点图。

2.补充说明:如果我们想要改变子区边缘相距画布边缘的距离和子区边缘之间的高度与宽度的距离,可以调用函数subplots_adjust()设置,其中关键字参数left,right,bottom,top,hspace,wspace都有默认值,并且是使用axes坐标轴系统度量即使用[0,1]之间的浮点数。前四个参数可以设调节子区距离画布的距离,wspace控制子区之间的宽度距离,hspace控制子区之间的高度距离。

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值