Python之Matplotlib使用

欢迎关注

微信公众号:想进化的猿

头条号:python进阶者

 

一、基本步骤

        在刚开始接触Matplotlib时,按下列步骤写好注释,再着手写代码,会是一个不错的熟练Matplotlib使用的方法。

# 0、导入包
import matplotlib.pyplot as plt
# 1、准备数据
x = [1, 2, 3, 4]
y = [10, 20, 30, 40]
# 2、创建图像
fig = plt.figure()
# 3、绘图
ax = fig.add_subplot(111)
ax.plot(x, y)
# 4、自定义设置
ax.set_xlim(1, 5)
# 5、保存图形(按需要使用)
plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

        上述例子简单绘制了一条直线,结果如下:

二、常用属性

        为了美化我们的图形,我们经常会设置图形的各种属性。

图表属性

        在第一步的创建图像方法plt.figure()中,我们可以通过传入参数来改变图像的显示属性。查阅官方文档,figure方法的参数包括figsize、dpi、facecolor、edgecolor、linewidth、frameon、subplotpars、tight_layout、constrained_layout。其中 subplotpars、tight_layout这两个参数与子图相关,暂时不详细展开,其他参数的含义如下:

        figsize:图像宽高,单位为英寸。(1英寸等于2.5cm)

        dpi:图像分辨率,即每英寸多少个像素,默认值80。

        facecolor:图像背景颜色。

        edgecolor:图像边框颜色。

        linewidth:图像边框线宽。

        frameon:是否显示边框。

        constrained_layout:是否自动布局,若为True则使用constrained_layout,会自动调整plot的位置。

        修改plt.figure(),传入相关参数,代码如下:

import matplotlib.pyplot as plt

# 1、准备数据
x = [1, 2, 3, 4]
y = [10, 20, 30, 40]
# 2、创建图像
fig = plt.figure(figsize=(3, 3), 
                 dpi=100, 
                 facecolor=(0,1,0,1), # (0,1,0,1)为颜色属性,四个值分别为r,g,b和透明度
                 edgecolor=(1,0,0,1), 
                 frameon=True, 
                 linewidth=1)
# 3、绘图
ax = fig.add_subplot(111)
ax.plot(x, y)
# 4、自定义设置
ax.set_xlim(1, 5)
# 5、保存图形(按需要使用)
plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

        运行后可以看到如下图表,可以通过调整参数进行尝试熟练各个参数的用法和用途。

坐标属性 

        在作拥有坐标轴的图表时,我们往往需要对坐标轴进行设置,例如坐标轴的名称、坐标轴的范围、坐标轴的刻度等。下面介绍几种常见的坐标轴设置。

        设置坐标轴的名称:plt.xlabel,plt.ylabel分别设置x轴和y轴的标签,这里我们使用ax=fig.add_subplot在figure中分出子图进行操作,故使用ax.set_xlabel,ax.set_ylabel进行设置,后续的属性也都是同一道理。

        下面我们给x轴添加标签“x”,给y轴添加标签“y”,代码如下:

# 0、导入包
import matplotlib.pyplot as plt
# 1、准备数据
x = [1, 2, 3, 4]
y = [10, 20, 30, 40]
# 2、创建图像
fig = plt.figure(figsize=(3, 3), dpi=100, facecolor=(0,1,0,1),
    edgecolor=(1,0,0,1), frameon=True, linewidth=1)
# 3、绘图
ax = fig.add_subplot(111)
ax.plot(x, y)
ax.set_xlabel('x') 
ax.set_ylabel('y')
# 4、自定义设置
ax.set_xlim(1, 5)
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

        运行后可以看到,坐标轴已经拥有了标签:

        设置坐标轴的范围:plt.xlim, plt.ylim分别设置x轴和y轴的大小范围。另外,plt.xticks, plt.yticks虽然用于设置刻度,但其同样可以用来设置坐标轴的范围。
        根据x, y的值我们设置x的范围为1-4,y的范围为10-40。两种设置方式分别如下:

# 0、导入包
import matplotlib.pyplot as plt
# 1、准备数据
x = [1, 2, 3, 4]
y = [10, 20, 30, 40]
# 2、创建图像
fig = plt.figure(figsize=(8, 3), dpi=100, facecolor=(0,1,0,1),
    edgecolor=(1,0,0,1), frameon=True, linewidth=1)
# 3、绘图
ax1 = fig.add_subplot(121)
ax1.plot(x, y)
ax2 = fig.add_subplot(122) # 这里为了比较创建两个子图
ax2.plot(x, y)
# 4、自定义设置
ax1.set_title('lim')
ax2.set_title('ticks')
ax1.set_xlabel('x') 
ax1.set_ylabel('y')
ax2.set_xlabel('x') 
ax2.set_ylabel('y')
ax1.set_xlim([1, 4]) # 设置边界
ax1.set_ylim([10, 40])
ax2.set_xticks(range(1, 5)) # 设置刻度
ax2.set_yticks([(i*10) for i in range(1, 5)])
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

        运行结果如下,可以看到,使用xlim/ylim设置的时候是严格的范围,而使用xticks/yticks设置的时候边界值上下都会有一定的间隙。

        设置坐标轴的刻度:除了上面介绍的xticks/yticks,有时我们会根据需求设置不同的刻度表示形式,例如小数、百分数等等,此时我们使用plt.set_xticklabels/plt.set_yticklabels。假设我们要将上述的横坐标和纵坐标的刻度都用两位小数展示,用法如下:

# 0、导入包
import matplotlib.pyplot as plt

# 1、准备数据
x = [1, 2, 3, 4]
y = [10, 20, 30, 40]
# 2、创建图像
fig = plt.figure(figsize=(3, 3), dpi=100, facecolor=(0,1,0,1),
    edgecolor=(1,0,0,1), frameon=True, linewidth=1)
# 3、绘图
ax = fig.add_subplot(111)
ax.plot(x, y)
# 4、自定义设置
ax.set_xlabel('x') 
ax.set_ylabel('y')
ax.set_xlim([1, 4]) # 设置边界
ax.set_ylim([10, 40])
ax.set_xticklabels('%.2f' %i for i in range(1, 5)) # 设置刻度表示形式
ax.set_yticklabels('%.21f' %(i*5) for i in range(2, 9))
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

        运行结果如下:

      

线条属性 

        在第3步绘图的ax.plot()方法中,我们可以通过传入参数来改变线条的显示属性。常见的有color、 marker、linestyle、linewidth等。

        color:线条颜色。常用的有r红, g绿, b蓝, c青, m紫红, y黄, k黑, w白。

        marker:坐标点标记。

        linestyle:线条形状。如"--","-", '-.'等。

        linewidth: 线条宽度。

        修改ax.plot(),传入相关参数,代码如下:

# 0、导入包
import matplotlib.pyplot as plt
# 1、准备数据
x = [1, 2, 3, 4]
y = [10, 20, 30, 40]
# 2、创建图像
fig = plt.figure(figsize=(3, 3), dpi=100, facecolor=(0,1,0,1),
    edgecolor=(1,0,0,1), frameon=True, linewidth=1)
# 3、绘图
ax = fig.add_subplot(111)
ax.plot(x, y, color='y', marker='.', linestyle='--', linewidth=1.5)
# 4、自定义设置
ax.set_xlabel('x') 
ax.set_ylabel('y')
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

        运行后可以看到如下图表,可以通过调整参数进行尝试熟练各个参数的用法和用途。

其他属性 

        legend:图例。可传参数包括handles,labels,loc等。handles是图线序列,labels是要显示的图例标签,loc是图例显示的位置,共有11种可选,传参时用String或Code均可。

        给之前的图简单添加一个图例,位置用best,自适应方式。

# 0、导入包
import matplotlib.pyplot as plt
# 1、准备数据
x = [1, 2, 3, 4]
y = [10, 20, 30, 40]
# 2、创建图像
fig = plt.figure(figsize=(3, 3), dpi=100, facecolor=(0,1,0,1),
    edgecolor=(1,0,0,1), frameon=True, linewidth=1)
# 3、绘图
ax1 = fig.add_subplot(111)
ax1.plot(x, y)
# 4、自定义设置
ax1.set_xlabel('x') 
ax1.set_ylabel('y')
# 设置边界
ax1.set_xlim([1, 4])
ax1.set_ylim([10, 40])
# 设置图例
ax1.legend(['legend'], loc=0)
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

        效果如下。当然,legend还有很多可选参数,在日后的学习工作中遇到了再记录。

        grid:给图表添加网格。可传参数包括b, which, axis和其他可选参数。b是否显示网格线,当提供color,linestyle等可选参数时,会默认b为True。which应用网格线,可传'major', 'minor', 'both'分别表示使用主刻度、次刻度、两者。axis应用轴,可传 'x', 'y', 'both'分别表示使用x轴、y轴、两者。可选参数包括color、linestyle、linewidth等。下面添加一个简单的网格线:

# 0、导入包
import matplotlib.pyplot as plt
# 1、准备数据
x = [1, 2, 3, 4]
y = [10, 20, 30, 40]
# 2、创建图像
fig = plt.figure(figsize=(3, 3), dpi=100, facecolor=(0,1,0,1),
    edgecolor=(1,0,0,1), frameon=True, linewidth=1)
# 3、绘图
ax1 = fig.add_subplot(111)
ax1.plot(x, y)
# 4、自定义设置
ax1.set_xlabel('x') 
ax1.set_ylabel('y')
# 设置边界
ax1.set_xlim([1, 4])
ax1.set_ylim([10, 40])
# 设置图例
ax1.legend(['legend'], loc=0)
# 添加网格线(使用主次刻度需要先设置,这里暂时忽略,直接用both)
ax1.grid(True, which='both', axis='both', color='y', linestyle='--', linewidth=1)
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

        结果如下:

        MultipleLocator, FormatStrFormatter:修改主次刻度。主刻度和次刻度就类似于一把直尺上cm与mm的关系。MultipleLocator生成刻度标签,FormatStrFormatter生成刻度标签格式,然后分别用set_major_locator、set_major_formatter、set_minor_locator、set_minor_formatter进行主次刻度的设置。下面对x轴进行主次刻度的设置:

# 0、导入包
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
# 1、准备数据
x = [1, 2, 3, 4]
y = [10, 20, 30, 40]
# 2、创建图像
fig = plt.figure(figsize=(3, 3), dpi=100, facecolor=(0,1,0,1),
    edgecolor=(1,0,0,1), frameon=True, linewidth=1)
# 3、绘图
ax1 = fig.add_subplot(111)
ax1.plot(x, y)
# 4、自定义设置
ax1.set_xlabel('x') 
ax1.set_ylabel('y')
# 设置边界
ax1.set_xlim([1, 4])
ax1.set_ylim([10, 40])
# 设置图例
ax1.legend(['legend'], loc=0)
# 设置主刻度 次刻度
x_major_locator = MultipleLocator(1) #将x轴主刻度标签设置为1的倍数
ax1.xaxis.set_major_locator(x_major_locator)
x_major_formatter = FormatStrFormatter('%.0f') #设置x轴标签文本的格式
ax1.xaxis.set_major_formatter(x_major_formatter)
x_minor_locator = MultipleLocator(0.5) #将x轴次刻度标签设置为0.5的倍数ax.xaxis.set_minor_locator(xminorLocator)
ax1.xaxis.set_minor_locator(x_minor_locator)
# 添加网格线
ax1.grid(True, which='both', axis='both', color='y', linestyle='--', linewidth=1)
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

        结果如下。可以看到x轴上1.5、2.5、3.5的位置上已经出现了次刻度。

        text:在坐标上添加文本,参数有x,y,s,fontdict,withdash。x,y是放置文本的位置。s是要添加的文本。fontdict用于覆盖默认文本属性的字典,例如fontsize等,如果fontdict为none,则默认值由rc参数(matplotlib.rcParams)决定。withdash创建一个TextWithDash实例用于代替Text实例。下面我们在(2, 20)这个位置添加一个文本。

# 0、导入包
import matplotlib.pyplot as plt
# 1、准备数据
x = [1, 2, 3, 4]
y = [10, 20, 30, 40]
# 2、创建图像
fig = plt.figure(figsize=(3, 3), dpi=100, facecolor=(0,1,0,1),
    edgecolor=(1,0,0,1), frameon=True, linewidth=1)
# 3、绘图
ax1 = fig.add_subplot(111)
ax1.plot(x, y)
# 4、自定义设置
ax1.set_xlabel('x') 
ax1.set_ylabel('y')
# 设置边界
ax1.set_xlim([1, 4])
ax1.set_ylim([10, 40])
# 设置图例
ax1.legend(['legend'], loc=0)
# 添加网格线
ax1.grid(True, which='both', axis='both', color='y', linestyle='--', linewidth=1)
# 添加注释
plt.text(2, 20, 'text', fontsize=10)
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

        结果如下:

        最后再简单介绍几个比较常用的属性方法,matplotlib.rcParams['xtick_direction'] 、matplotlib.rcParams['ytick.direction']可以设置刻度的方向,rcParams是pylot使用rc配置文件来自定义图形各种默认属性的方法,也叫rc配置或rc参数,通过rc参数可以修改图表的默认属性,包括窗体大小、每英寸的点数、线条宽度、颜色、样式、坐标轴、坐标和网络属性、文本、字体等。plt.axis('off')可以关闭坐标轴,如果想只关闭x轴或y轴,可以使用frame = plt.gca()获取当前子图,然后用frame.axes.get_xaxis().set_visible(False)或frame.axes.get_yaxis().set_visible(False)对x轴或y轴设置是否显示。

三、子图

        在Matplotlib中,整个图像就是一个Figure对象,在Figure对象中可以包含一个或多个Axes对象,而每个Axes对象都是拥有自己的坐标系系统的绘图区域。在同一个Figure图像下的每个图表都代表这个图像的一个子图。

子图的创建方法

        常用的子图创建方法一般有三种。

        第一种,利用Figure对象的add_subplot方法生成子图然后再向其中填充图表。add_subplot方法的参数包括nrows, ncols, index以及可选参数。其中nrows, ncols是子图的行列大小,index是当前创建的子图的索引,即作为图像的第几个子图。

        为了更好地展示图表,用到了numpy和pandas来创建数据。首先创建一个2*2共4个子图区域的图像,然后向其中的3个子图区域填充图表。注意,这里创建的4个区域只是占位符,不一定要去填充,而且不一定要根据顺序去填充。

# 0、导入包
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 1、准备数据
data1 = np.random.rand(100).cumsum()
data2 = 50-np.random.rand(100).cumsum()
# 2、创建图像
fig = plt.figure(figsize=(6, 6), facecolor=(0, 1, 0, 1))
# 3、绘图
ax1 = fig.add_subplot(2, 2, 1)
ax1.plot(data1)
ax2 = fig.add_subplot(2, 2, 2)
ax2.plot(data2)
ax3 = fig.add_subplot(2, 2, 3)
df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
ax3.plot(df)
# 4、自定义设置
ax1.set_title("No.1")
ax2.set_title("No.2")
ax3.set_title("No.3")
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

        运行后可以看到,在左上、右上、左下三个位置分别生成了图表,当然我们也可以根据需要或自己的喜好在4个子图区域中随意选择摆放图表的位置。

        第二种,使用plt.add_subplots方法同时生成Figure对象和axes对象数组,每个axes对象就相当于一个子图。add_subplots方法的参数包括nrows, ncols, sharex, sharey, squeeze, subplot_kw, gridspec_kw。其中nrows, ncols就是子图的行列大小,共生成nrows*ncols个子图。sharex, sharey设置是否共享x轴或y轴,默认不共享。squeeze默认True,挤压多余尺寸,一般默认即可。subplot_kw、gridspec_kw可选参数,用来设置子图的属性。

        首先使用subplots方法得到axes对象数组,然后分别取出相应子图进行设置,同样,这里创建的axes也只是占位符。

# 0、导入包
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 1、准备数据
data1 = np.random.rand(100).cumsum()
data2 = 50-np.random.rand(100).cumsum()
# 2、创建图像
fig, axes = plt.subplots(2, 2, figsize=(6, 6), facecolor=(0, 1, 0, 1))
# 3、绘图
ax1 = axes[0, 0]
ax1.plot(data1)
ax2 = axes[0, 1]
ax2.plot(data2)
ax3 = axes[1, 0]
df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
ax3.plot(df)
# 4、自定义设置
ax1.set_title("No.1")
ax2.set_title("No.2")
ax3.set_title("No.3")
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

        运行结果如下图所示。 可以看到,与之前先生成子图区域再填充的方法相比,生成axes数组会将坐标轴事先生成,即使不向其中添加图表,坐标轴也会展示在相应的位置。

  • 16
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值