python数据分析学习day07:图表样式和子图

1. 显示网格:plt.grid()

plt.grid(True, linestyle = "--",color = "gray", linewidth = "0.5",axis = 'both')
  • 显示网格
  • linestyle:线型
  • color:颜色
  • linewidth:宽度
  • axis:x,y,both,显示x/y/两者的格网
x = np.linspace(-np.pi,np.pi,256,endpoint = True)
c, s = np.cos(x), np.sin(x)
plt.plot(x, c)
plt.plot(x, s)
# 通过ndarry创建图表
# plt.grid(True, linestyle = "--",color = "gray", linewidth = "0.5",axis = 'both')
plt.grid(True,linestyle="--")

  

2.  plt.gca( ) 对坐标轴的操作

首先观察画布上面的坐标轴,如下图:

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        

上图中,用红色标识出的黑色边界框线在Matplotlib中被称为spines,中文翻译为脊柱......在我理解看来,意思是这些边界框线是坐标轴区域的“支柱”。

那么,我们最终要挪动的其实就是这四个“支柱”

且所有的操作均在plt.gca( )中完成,gca就是get current axes的意思

接下来需要绘制图如下:

# 创建x轴数据
x = np.arange(-50,51)
# 创建y轴的数据,他是x的平方
y = x ** 2
plt.plot(x, y)

x = np.arange(-50,51)
y = x ** 2
# 获取当前坐标轴
ax = plt.gca()
# 通过坐标轴spines,确定 top, bottom, left, right (分别表示上,下,左和右)

# 不需要右侧和上侧线条,则可以设置他的颜色
ax.spines['right'].set_color("none")
ax.spines['top'].set_color("none")

plt.plot(x, y)

# 分别定义x y
x = np.arange(-50,51)
y = x ** 2
# 获取当前坐标轴
ax = plt.gca()
# 不需要右侧和上侧线条,则可以设置他的颜色
ax.spines['right'].set_color("none")
ax.spines['top'].set_color("none")
# 移动下轴到指定位置
# 在这里,position位置参数有三种,data , outward(向外-可自行尝试) , axes
# axes:0.0 - 1.0之间的值,整个轴上的比例
ax.spines['left'].set_position(('axes',0.5)) # 等价于ax.spines['left'].set_position(('data',0.0))
# 移动下轴到指定位置
# 'data'表示按数值挪动,其后数字代表挪动到Y轴的刻度值
#ax.spines['bottom'].set_position(('data',0.0))
plt.ylim(0, y.max()) # 设置轴取值范围
plt.plot(x, y)

 

3. plt.rcParams设置画图的分辨率,大小等信息

  • plt.rcParams['figure.figsize'] = (8.0, 4.0) # 设置figure_size英寸
  • plt.rcParams['figure.dpi'] = 300 #分辨率
    • 默认的像素:[6.0,4.0],分辨率为72,图片尺寸为 432x288
    • 指定dpi=100,图片尺寸为 600*400
    • 指定dpi=300,图片尺寸为 1800*1200

4.图表的样式参数设置

4.1 线条样式

传入x,y,通过plot画图,并设置折线颜色、透明度、折线样式和折线宽度 标记点、标记点大小、标记点边颜色、标记点边宽,网格

plt.plot(x,y,color='red',alpha=0.3,linestyle='-',linewidth=5,marker='o',markeredgecolor='r',markersize='20',markeredgewidth=10)
  • 1). color:可以使用颜色的16进制,也可以使用线条颜色的英文,还可以使用之前的缩写
字符颜色英文全称
‘b’蓝色blue
‘g’绿色green
’ r ’红色red
’ c ’青色cyan
’ m ’品红magenta
’ y ’黄色yellow
’ k ’黑色black
’ w ’白色white

颜色参考地址:RGB颜色查询对照表_颜色代码表_颜色的英文名称大全 - 颜色相关工具 - 脚本之家在线工具

  • 2). alpha: 0-1,透明度

  • 3). linestyle:折线样式

字符描述
'-'实线
'--'虚线
'-.'点划线
':'虚线
  • 3). marker标记点:
标记符号描述
'.'点标记
'o'圆圈标记
'x''X'标记
'D'钻石标记
'H'六角标记
's'正方形标记
'+'加号标记
x= np.arange(0, 100,10)
y= x ** 2
"""linewidth 设置线条粗细
   label 设置线条标签
   color 设置线条颜色
   linestyle 设置线条形状
   marker 设置线条样点标记
"""
plt.plot(x, y, linewidth = '2', label = "test", color='b', linestyle='--', marker='H')
plt.legend(loc='upper left')

 

 4.2 线条样式缩写

# 颜色 标记 样式
plt.plot([1,2,3],[4,7,6],'r*-.')
plt.plot([2,4,5],[3,8,7],'m+--')

plt.rcParams['figure.figsize']=(8,4)
#不同种类不同颜色的线
#不同种类不同颜色的线并添加图例
x=np.linspace(0,10,100)

plt.plot(x,x+0, '-g', label='-g')    #实线  绿色

plt.plot(x,x+1, '--c', label='--c')   #虚线 浅蓝色

plt.plot(x,x+2, '-.k', label='-.k')   #点划线 黑色

plt.plot(x,x+3, '-r', label='-r')    #实线  红色

plt.plot(x,x+4, 'o', label='o')     #点   默认是蓝色

plt.plot(x,x+5, 'x', label='x')     #叉叉  默认是蓝色

plt.plot(x,x+6, 'dr', label='dr')    #砖石  红色

#添加图例右下角lower right  透明度  阴影  边框宽度
plt.legend(loc='lower right',framealpha=0.5,shadow=True, borderpad=0.5)

5.创建图形对象

在 Matplotlib 中,面向对象编程的核心思想是创建图形对象(figure object)。通过图形对象来调用其它的方法和属性,这样有助于我们更好地处理多个画布。在这个过程中,pyplot 负责生成图形对象,并通过该对象来添加一个或多个 axes 对象(即绘图区域)。

Matplotlib 提供了matplotlib.figure图形类模块,它包含了创建图形对象的方法。通过调用 pyplot 模块中 figure() 函数来实例化 figure 对象。

创建图形对象

figure方法如下:

plt.figure(
 num=None,------------------------> 图像编号或名称,数字为编号 ,字符串为名称 
figsize=None,---------------------> 指定figure的宽和高,单位为英寸; 
dpi=None,-------------------------> 定绘图对象的分辨率,即每英寸多少个像素,缺省值为72 facecolor=None,-------------------> 背景颜色 
edgecolor=None, ------------------> 边框颜色 
frameon=True, --------------------> 是否显示边框 
**kwargs, )
from matplotlib import pyplot as plt
# 创建图形对象,相当于我们创建一个画布
fig = plt.figure()

# 之前通过配置更改图形的分辨率和宽高. 如今可以在创建图像对象时创建
fig = plt.figure('f1',figsize=(3,2),dpi=100)
# plt.plot()
x = np.arange(0,50)
y = x ** 2
plt.plot(x,y)

6. 绘制多子图

figure是绘制对象(可理解为一个空白的画布),一个figure对象可以包含多个Axes子图,一个Axes是一个绘图区域,不加设置时,Axes为1,且每次绘图其实都是在figure上的Axes上绘图。

接下来将学习绘制子图的几种方式:

  • add_axes() : 添加区域
  • subplot() : 均等地划分画布,只是创建一个包含子图区域的画布,(返回区域对象)
  • subplots() : 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象.(返回图形对象和区域对象)

6.1 add_axes() : 添加区域

Matplotlib 定义了一个 axes 类(轴域类),该类的对象被称为 axes 对象(即轴域对象),它指定了一个有数值范围限制的绘图区域。在一个给定的画布(figure)中可以包含多个 axes 对象,但是同一个 axes 对象只能在一个画布中使用。

2D 绘图区域(axes)包含两个轴(axis)对象

语法:

add_axes(rect)

  • 该方法用来生成一个 axes 轴域对象,对象的位置由参数rect决定
  • rect 是位置参数,接受一个由 4 个元素组成的浮点数列表,形如 [left, bottom, width, height] ,它表示添加到画布中的矩形区域的左下角坐标(x, y),以及宽度和高度。

如下所示:

fig = plt.figure(figsize=(4,2),facecolor='g')

# ax1从画布起始位置绘制,宽高和画布一致
ax1=fig.add_axes([0,0,1,1])

# ax2 从画布 20% 的位置开始绘制, 宽高是画布的 50%
#ax2=fig.add_axes([0.2,0.2,0.5,0.5])
#ax2=fig.add_axes([0.5,0.5,0.5,0.5])
ax2=fig.add_axes([0.1,0.6,0.3,0.3])

ax3=fig.add_axes([0.5,0.6,0.2,0.3])
ax1.plot(x, y)
ax2.plot(x, y)
ax3.plot(x, y)

 

注意:每个元素的值是画布宽度和高度的分数。即将画布的宽、高作为 1 个单位。比如,[ 0.2, 0.2, 0.5, 0.5],它代表着从画布 20% 的位置开始绘制, 宽高是画布的 50%

注意:不能直接使用图形对象画图fig.plot(),可以使用ax.plot()和plt.plot()

区域中基本方法的使用

  • 区域图表名称: set_title
  • 区域中x轴和y轴名称:set_xlabel() set_ylabel()
  • 刻度设置: set_xticks()
  • 区域图表图例: legend()
# 创建绘图对象
fig = plt.figure(figsize=(4,2),facecolor='g')

# 创建x坐标
x = np.arange(0,50,2)
# 创建y坐标
y = x ** 2
# 创建区域1,和画布位置一致
ax1 = fig.add_axes([0.0,0.0,1,1])
# 设置图表名称
ax1.set_title("axes1")
# x轴名称 
ax1.set_xlabel('X axis')

# 设置ax1横轴刻度
ax1.set_xticks(np.arange(0,50,3))

# 区域绘制图形
ax1.plot(x,y,label="ax1")
# 图例
ax1.legend()
# 创建区域ax2 从画布 40% 的位置开始绘制, 宽高是画布的 50%
ax2=fig.add_axes([0.2,0.2,0.4,0.4])
ax2.set_title("axes2")

# 区域2中绘制图形
ax2.plot(x,y,label='ax2')
# 图例,
ax2.legend()

 

 

6.2 subplot() 函数,它可以均等地划分画布

参数格式如下:

ax = plt.subplot(nrows, ncols, index,*args, **kwargs)
  • nrows 行
  • ncols 列
  • index: 位置
  • kwargs: title/xlabel/ylabel 等.....

也可以直接将几个值写到一起,如:subplot(233)

返回:区域对象

nrows 与 ncols 表示要划分几行几列的子区域(nrows*nclos表示子图数量),index 的初始值为1,用来选定具体的某个子区域。

例如: subplot(233)表示在当前画布的右上角创建一个两行三列的绘图区域(如下图所示),同时,选择在第 3 个位置绘制子图。

        ​​​​​​​        ​​​​​​​        ​​​​​​​                        

如果新建的子图与现有的子图重叠,那么重叠部分的子图将会被自动删除,因为它们不可以共享绘图区域。

# 默认画布分割成2行1列,当前所在区域为1
plt.subplot(211)
# x可省略,默认[0,...,N-1]递增,N为y轴元素个数
plt.plot(range(50,70),marker="o")
plt.grid()

# 默认画布分割成2行1列,当前所在区域为2
plt.subplot(212)
plt.plot(np.arange(12)**2)

plt.plot([1,2,3])
#现在创建一个子图,它表示一个有1行2列的网格的顶部图。
#因为这个子图将与第一个重叠,所以之前创建的图将被删除
plt.subplot(211)
# x可省略,默认[0,1..,N-1]递增
plt.plot(range(50,70))

plt.subplot(212)

plt.plot(np.arange(12)**2)

如果不想覆盖之前的图,需要先创建画布,也就是

plt.plot([1,2,3,4])
# 还可以先设置画布的大小,再通过画布创建区域
fig = plt.figure(figsize=(4,2))

fig.add_subplot(111)

plt.plot(range(20))

fig.add_subplot(221)

plt.plot(range(12))

 

设置多图的基本信息方式:

a. 在创建的时候直接设置:

  • 对于subplot关键词赋值参数的了解,可以将光标移动到subplot方法上,使用快捷键shift+tab查看具体内容
#现在创建一个子图,它表示一个有2行1列的网格的顶部图。
plt.subplot(211,title="pic1", xlabel="x axis")
# x可省略,默认[0,1..,N-1]递增
plt.plot(range(50,70))

plt.subplot(212, title="pic2", xlabel="x axis")

plt.plot(np.arange(12)**2)

 

发现子图标题重叠,在最后使用plt.tight_layout()

#现在创建一个子图,它表示一个有2行1列的网格的顶部图。
#--------------- 第一个区域---------------
plt.subplot(211,title="pic1", xlabel="x axis")
# x可省略,默认[0,1..,N-1]递增
plt.plot(range(50,70))

#--------------------第二区域-----------
plt.subplot(212, title="pic2", xlabel="x axis")

plt.plot(np.arange(12)**2)
# 紧凑的布局
plt.tight_layout()

 b.使用pyplot模块中的方法设置后再绘制

#现在创建一个子图,它表示一个有2行1列的网格的顶部图。

#--------------- 第一个区域---------------
plt.subplot(211)
# 使用图形对象:
plt.title("ax1")
# x可省略,默认[0,1..,N-1]递增
plt.plot(range(50,70))

#--------------------第二区域-----------
plt.subplot(212)
plt.title("ax2")

#...其他的自己设置

plt.plot(np.arange(12)**2)
# 紧凑的布局
plt.tight_layout()

c.使用返回的区域对象设置

注意区域对象的方法很多都是set_开头

  • 使用区域对象将不存在 设置位置
#现在创建一个子图,它表示一个有2行1列的网格的顶部图。
ax1 = plt.subplot(211) # 创建第一个区域
ax2 = plt.subplot(212) # 创建第二个区域

#--------------- 第一个区域 ax1---------------
# 使用区域对象:
ax1.set_title("ax1")
# x可省略,默认[0,1..,N-1]递增
ax1.plot(range(50,70))

#--------------------第二区域 ax2-----------
ax2.set_title("ax2")

#...其他的自己设置

ax2.plot(np.arange(12)**2)
# 紧凑的布局
plt.tight_layout()

6.3 subplots()函数详解

matplotlib.pyplot模块提供了一个 subplots() 函数,它的使用方法和 subplot() 函数类似。其不同之处在于,subplots() 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象,而 subplot() 只是创建一个包含子图区域的画布。

subplots 的函数格式如下:

fig , ax = plt.subplots(nrows, ncols)
  • nrows 与 ncols 表示两个整数参数,它们指定子图所占的行数、列

函数的返回值是一个元组,包括一个图形对象和所有的 axes 对象。其中 axes 对象的数量等于 nrows * ncols,且每个 axes 对象均可通过索引值访问(从1开始)

例1:我们创建了一个 2 行 2 列的子图,并在每个子图中显示 4 个不同的图像:

# 引入模块
import matplotlib.pyplot as plt
import numpy as np

# 创建2行2列的子图,返回图形对象(画布),所有子图的坐标轴
fig, axes =  plt.subplots(2,2)

x = np.arange(1,5)
#绘制平方函数
axes[0][0].plot(x, x*x)
axes[0][0].set_title('square')
#绘制平方根图像
axes[0][1].plot(x, np.sqrt(x))
axes[0][1].set_title('square root')
#绘制指数函数
axes[1][0].plot(x, np.exp(x))
axes[1][0].set_title('exp')

#绘制对数函数
axes[1][1].plot(x,np.log10(x))
axes[1][1].set_title('log')

# 处理标题遮挡
plt.tight_layout()

plt.show()

 例2:

fig,axes =  plt.subplots(1,2)
# 设置画布的高和宽, 注意:只为英寸 ,默认分别率为72
fig.set_figheight(3) # 实际高度为 73*3 像素
fig.set_figwidth(8) # 实际宽度为 73*8 像素
# 设置背景:
fig.set_facecolor('gray')
# 分别定义x y
x = np.arange(-50,51)
y = x ** 2

#--------------------绘制图形1 -----------
axes[0].plot(x, y)

# ------------处理图形2的绘制----------------
# 不需要右侧和上侧线条,则可以设置他的颜色
axes[1].spines['right'].set_color("none")
axes[1].spines['top'].set_color("none")
# 移动下轴到指定位置
# 在这里,position位置参数有三种,data , outward(向外-可自行尝试) , axes
# axes:0.0 - 1.0之间的值,整个轴上的比例
axes[1].spines['left'].set_position(('axes',0.5))

# 移动下轴到指定位置
# 'data'表示按数值挪动,其后数字代表挪动到Y轴的刻度值
axes[1].spines['bottom'].set_position(('data',0.0))

axes[1].plot(x, y)

 例3:

# 一共划分了2X2=4个区域,到第三个区域时绘制2X1,移动到第二个图
ax1 = plt.subplot(221)
ax1.plot([1,2,3,4],[4,5,7,8],'--r')

ax2 = plt.subplot(222)
ax2.plot([1,2,3,4,5],[2,3,5,6,7],'-y')

ax3 = plt.subplot(212)
ax3.plot(np.arange(10,46),'-.g')

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值