Matplotlib 快速入门教程

本文介绍了数据可视化工具Matplotlib的基本用法。



Jupyter Notebook 常用快捷键:

  • 两种模式通用快捷键:

    Shift+Enter,执行本单元,并跳转到下一单元。

    Ctrl+Enter,执行本单元,留在本单元。

  • 命令模式:按ESC进入。

    • Y,cell切换到Code模式
    • M,cell切换到Markdown模式
    • A,在当前cell的上面添加cell
    • B,在当前cell的下面添加cell
    • Z,回退
    • L,为当前cell加上行号
    • 双击D,删除当前cell
    • Ctrl+Shift+P,对话框输入命令直接运行
    • Ctrl+Home,跳转到首个cell
    • Ctrl+End,跳转到最后一个cell
  • 编辑模式:按Enter进入。

    • 多光标操作:按住Ctrl键,点击鼠标
    • 回退:Ctrl+Z
    • 重做:Ctrl+Y
    • 补全代码:变量、方法后跟Tab
    • 注释:Ctrl+/
    • 屏蔽自动输出消息:可在最后一条语句后加

1. Matplotlib

为什么要使用Matplotlib?

  • 数据可视化 – 绘制二维图表(三维图也可),帮助理解数据,方便选择更合适的分析方法;
  • js库更能胜任交互式的数据可视化 – D3, echarts;
  • 奥卡姆剃刀原理 – 如无必要勿增实体,能够满足自身需要即可。

1.1 Matplotlib图像结构

在这里插入图片描述


1.2 Matplotlib 三层结构

  1. 容器层:主要由Canvas、Figure、Axes组成。
    画板层(Canvas):是位于最底层的系统层,在绘图中充当画板的角色,即放置画布(Figure)的工具。
    画布层(Figure):是Canvas上方的第一层,也是需要用户来操作的应用层的第一层,在绘图的过程中充当画布的角色。
    绘图区/坐标系(Axes):plt.subplots();是应用的第二层,在绘图的过程中相当于画布上的绘图区的角色。

    • Figure:指整个图形(可以通过plt.figure()设置画布的大小和分辨率等)
    • Axes(坐标系):数据的绘图区域
    • Axis(坐标轴):坐标系中的一条轴,包含大小限制、刻度和刻度标签

    特点为:

    • 一个figure(画布)可以包含多个axes(坐标系/绘图区),但是一个axes只能属于一个figure。
    • 一个axes(坐标系/绘图区)可以包含多个axis,包含两个即为2d坐标系,3个即为3d坐标系。
  2. 辅助显示层

  3. 图像层:指通过plot、scatter、bar、histogram、pie等函数根据数据绘制出的图像。

    图例等辅助显示层以及图像层都是建立在Axes之上。



2. 折线图(plot)与基础绘图功能

matplotlib.pyplot包含了一系列的类似于matlib的画图函数,他的函数作用于当前函数图形(figure)的当前坐标系(axes)。

  1. 基本语法
# 1.创建画布
plt.figure()

# 2.绘制图像
plt.plot()

# 3.显示图像
plt.show()

  1. 设置画布属性
plt.figure(figsize=(20,8), dpi=140)
  • figsize:画布大小,指定长宽。
  • dpi:清晰度,每一英寸有多少个点(dot per inch)。

  1. 保存图像
plt.savefig('name.png')

注意:该语句应放在plt.show()之前,否则保存的图像为空白。因为plt.show()会释放figure资源。


  1. 修改x、y轴刻度
'''实例:画出某城市11点到12点一小时内每分钟的温度变化折线图,温度范围在15~18°C。'''
import random

# 1.准备数据
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x] # uniform表示随机生成的数据为均匀分布。

# 2.创建画布
plt.figure(figsize=(20,8), dpi=140)

# 3.绘制图像
plt.plot(x,y_shanghai)

# 4.显示图像
plt.show()

显示结果:
在这里插入图片描述

  1. 修改x,y轴刻度信息
# 设置x轴的刻度信息
x_label = ["11点{}分".format(i) for i in x]
plt.xticks(x[::5], x_label[::5]) # 注意保证步长一一对应
plt.yticks(range(0, 40, 5)) # 设置y坐标轴显示步长
# plt.yticks(range(40)[::5]) 同样的功能

注意!解决win10系统matplotlib中文字体不显示问题:
方法一:
2. 1)放置字体
下载字体:Microsoft JhengHei.ttf;提取码:03bu。
放置字体:将字体Microsoft JhengHei.ttf放在盘符:\anaconda安装路径\Lib\site-packages\matplotlib\mpl-data\fonts\ttf路径下。如果实在某一虚拟环境中使用matplotlib,应该移动到对应环境下的该目录。

  • 2)删除matplotlib缓存文件
    删除C:\Users\用户名路径下的.matplotlib文件
  • 3)程序中使用
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei']  # 中文字体设置  
plt.rcParams['axes.unicode_minus'] = False

为了修复不显示中文的问题,试了修改配置文件的方法,但是不起作用。于是,在程序中输入以上语句后,成功显示中文字体。注意!程序中字体设置的名称,应该为字体文件.ttf中的名称!并且相应的文件名也应该修改。如图所示:
在这里插入图片描述
在这里插入图片描述


方法二:

from matplotlib.font_manager import FontProperties
my_font = FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf',size=15)
#需要设置中文时,添加fontproperties参数
plt.xticks(fontproperties=my_font)

#seaborn中文显示
sns.set(font=myfont.get_name())

  1. 添加网格显示
plt.grid(linestyle = "--", alpha = 0.5)

  1. 添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("某城市11点到12点一小时内每分钟的温度变化折线图")

  1. 添加折线
y_beijing = [random.uniform(1,3) for i in x]
plt.plot(x, y_beijing)

  1. 修改图形颜色和风格
plt.plot(x, y_beijing, color = 'r', linestyle = '--')
颜色字符风格字符
r 红色- 实线
g 绿色– 虚线
b 蓝色-. 点划线
w 白色: 点虚线
c 青色’ ’ 留空、空格
m 洋红
y 黄色
k 黑色

  1. 设置图例
plt.plot(x,y_shanghai, label = '上海')
plt.plot(x, y_beijing, color = 'r', linestyle = '--', label = '北京')

# 显示图例
plt.legend(loc = 'best')
Location StringLocation Code
‘best’0
‘upper right’1
‘upper left’2
‘lower left’3
‘lower right’4
‘right’5
‘center left’6

以上完整代码:

import matplotlib.pyplot as plt
import random
#Ipython中的魔法函数,直接在python console里绘图
%matplotlib inline 

# 设置中文显示
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei']  # 中文字体设置  
plt.rcParams['axes.unicode_minus'] = False

# 1.构造输入
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x] # uniform表示随机生成的数据为均匀分布。
y_beijing = [random.uniform(1,3) for i in x]

# 2.创建画布
plt.figure(figsize=(20,8), dpi=140)

# 3.绘图
#plt.plot(x,y_shanghai)
#plt.plot(x, y_beijing)
plt.plot(x,y_shanghai, label = '上海')
plt.plot(x, y_beijing, color = 'r', linestyle = '--', label = '北京')

# 显示图例
plt.legend(loc = 'best')

# 修改x,y轴刻度信息
x_label = ["11点{}分".format(i) for i in x]
plt.xticks(x[::5], x_label[::5]) # 注意保证步长一一对应
plt.yticks(range(0, 40, 5)) # 设置y坐标轴显示步长

# 添加网格显示
plt.grid(linestyle = "--", alpha = 0.5)

# 添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("某城市11点到12点一小时内每分钟的温度变化折线图")

# 保存图像
plt.savefig('03-2.png')

# 4.显示
plt.show()

输出结果:
在这里插入图片描述


  1. 创建多个绘图区
matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False, \
squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)

nrows, ncolsint, optional, default: 1
Number of rows/columns of the subplot grid.

sharex, shareybool or {‘none’, ‘all’, ‘row’, ‘col’}, default: False
Controls sharing of properties among x (sharex) or y (sharey) axes:

  • True or ‘all’: x- or y-axis will be shared among all subplots.
  • False or ‘none’: each subplot x- or y-axis will be independent.
  • ‘row’: each subplot row will share an x- or y-axis.
  • ‘col’: each subplot column will share an x- or y-axis.

具体可参考官方文档说明

plt.subplots() 返回值:

figure, axes = plt.subplots(nrows = 1, ncols = 2, **fig_kw)

完整代码:

# 设置中文显示
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei']  # 中文字体设置  
plt.rcParams['axes.unicode_minus'] = False

# 1.构造输入
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x] # uniform表示随机生成的数据为均匀分布。
y_beijing = [random.uniform(1,3) for i in x]

# 2.创建画布
#plt.figure(figsize=(20,8), dpi=140)
figure, axes = plt.subplots(nrows=1, ncols=2, figsize=(20,8), dpi=140)

# 3.绘图
axes[0].plot(x,y_shanghai, label='上海')
axes[1].plot(x, y_beijing, color='r', linestyle='--', label='北京')

# 显示图例
axes[0].legend()
axes[1].legend()

# 修改x,y轴刻度信息
x_label = ["11点{}分".format(i) for i in x]

axes[0].set_xticks(x[::5]) #设置x坐标轴显示步长
axes[0].set_xticklabels(x_label)
axes[0].set_yticks(range(0, 40, 5)) #设置y坐标轴显示步长
axes[1].set_xticklabels(x_label)
axes[1].set_xticks(x[::5]) 
axes[1].set_yticks(range(0, 40, 5))

# 添加网格显示
axes[0].grid(linestyle = "--", alpha = 0.5)
axes[1].grid(linestyle = "--", alpha = 0.5)

# 添加描述信息
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_title("上海11点到12点一小时内每分钟的温度变化折线图")
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_title("北京11点到12点一小时内每分钟的温度变化折线图")
# 保存图像
plt.savefig('03-3.png')

# 4.显示
plt.show()

输出结果:
在这里插入图片描述


  1. 数学函数:
# 1.准备数据
import numpy as np
x = np.linspace(-1,1,1000)
y = 2 * x * x

# 2.创建画布
plt.figure(figsize=(20,8),dpi=80)
# 3.绘制图像
plt.plot(x,y)

# 网格显示
plt.grid(linestyle='--', alpha = 0.5)
# 4.显示图像
plt.show()

3. 散点图

  1. 常见图形种类及意义:
  • 折线图plot:数据变化趋势
  • 散点图scatter:数据之间的关系/规律
  • 柱状图bar:数据统计/对比
  • 直方图histogram:反应一组连续数据的分布状况
  • 饼图pie:占比
  1. 散点图
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=<deprecated parameter>, edgecolors=None, *, plotnonfinite=False, data=None, **kwargs)[source]

具体可参考官方文档


4.柱状图

matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)[source]

具体可参考官方文档

实例:

#1.准备数据
movie_names = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','战狼2']
tickets = [73853,57767,22354,15969,14839,8725,8716,88521]

#2.创建画布
plt.figure(figsize=(20,8), dpi=140)

#3.绘制柱状图
x_ticks = range(len(movie_names))
plt.bar(x_ticks, tickets, color=['b','r','g','c','m','y','k','b'],label='全球票房')

#修改x刻度
plt.xticks(x_ticks, movie_names, size=20)

#添加网格
plt.grid(linestyle='--', alpha=0.5)

#添加标题
plt.title('电影票房对比',size=30)

#设置坐标轴信息
plt.xlabel('电影',size=20)
plt.ylabel('票房/美元',size=20)

#保存图像
plt.savefig('03-4.png')

#显示图像
plt.show()

输出结果:
在这里插入图片描述


需求2:对比

#1.准备数据
movie_name = ['雷神3:诸神黄昏','正义联盟','寻梦环游记']

first_day = [10587.6,10062.5,1275.7]
first_weekend = [36224.9, 34479.6, 11830]

#2.创建画布
plt.figure(figsize=(20,8), dpi=80)

#3.绘制柱状图
x = range(len(movie_name))
plt.bar(x,first_day, width=0.2, label='首日票房')
plt.bar([i+0.2 for i in x], first_weekend, width=0.2, label='首周票房')

#添加网格
plt.grid(linestyle='--', alpha=0.5)

#显示图例
plt.legend()

#修改刻度
plt.xticks([i+0.1 for i in x], movie_name, size=20)

#保存图像
plt.savefig('03-5.png')

#4.显示图像
plt.show()

输出结果:
在这里插入图片描述


5.直方图

直方图设计统计学的概念,首先要对数据进行分组,然后统计每个分组内数据元的数量。在坐标系中,横轴标出每个组的端点,纵轴表示频数,每个矩形的高代表对应的频数,称这样的统计图为频数分布直方图。

组数:在统计数据时,我们把数据按照不同的范围分成几组,分成的组的个数成为组数。
组距:每一组两个端点的差。

直方图描述的是一组数据的频次分布,是以矩形的长度表示每一组的频数或数量,宽度则表示各组的组距,因此其高度与宽度均有意义,利于展示大量数据集的统计结果。直方图有助于帮助我们指导数据的分布情况,诸如众数、中位数的大致位置、数据是否存在缺口或者异常值。

5.1 直方图与柱状图的区别

  1. **直方图展示数据的分布、柱状图比较数据的大小。**这是直方图和柱状图的本质区别。
  2. **直方图X轴为定量数据,柱状图X轴为分类数据。**直方图上的每根柱子是不可移动的,X轴上的区间是连续的、固定的。而柱状图上的每根柱子是可以随意排序的。
  3. 直方图柱子间无间隔,柱状圆柱子有间隔。
  4. 直方图柱子宽度可不一,柱状图柱子宽度必须 一致。

5.2 直方图绘制

matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, *, data=None, **kwargs)

常用参数:

  • x:输入值
  • bins:组数
#1.准备数据
time = [131,98,125,131,124,139,131,117,128,135,138,131,102,107,114,119,121,136,132,117]

#2.创建画布
plt.figure(figsize=(20,8), dpi=140)

#3.绘制直方图
distance = 2
group_num = int((max(time) - min(time)) / distance)

plt.hist(time, bins=group_num, normed=True)

plt.grid(linestyle='--',alpha=0.5)

#修改x轴刻度
plt.xticks(range(min(time),max(time)+2, distance))

#4.显示图像
plt.show()

注意:y轴所代表的的变量。可以是频次,也可以是频率。


6.饼图

matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, *, data=None)

常用参数:

  • x:数量,自动计算百分比
  • labels:每部分名称
  • autopct:占比显示指定%1.2f%%
  • colors:每部分颜色
#1.准备数据
movie_names = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','战狼2']
place_count = [60605,54546,45819,28243,13270,9945,7679,68665]

#2.创建画布
plt.figure(figsize=(20,8), dpi=140)

#3.绘制饼图
plt.pie(place_count,labels=movie_names, colors=['b','r','g','c','m','y','k','b'], autopct='%1.2f%%')

#让图形保持圆形
plt.axis('equal')

#显示图例
plt.legend()

#保存图像
plt.savefig('03-6')
#4.显示图像
plt.show()

输出显示:
在这里插入图片描述

课程链接:https://edu.aliyun.com/course/1797

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页