Python:Matplotlib的使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C40F35Sd-1596548286857)(F:\JianShu_material\Python\Matplotlib的使用\000.png)]

1. Matplotlib的三层结构

1.1 容器层

容器层主要由Canvas、Figure、Axes组成。

Canvas是位于最底层的系统层,在绘图的过程中充当画板的角色,即放置画布(Figure)的工具。

Figure是Canvas上方的第一层,也是需要用户来操作的应用层的第一层,在绘图的过程中充当画布的角色。

Axes是应用层的第二层,在绘图的过程中相当于画布上的绘图区的角色。

画板层上有画布层,画布层上有绘图区。

画板层不用我们显式的创建,但是画布层需要显式创建(plt.figure),画布层上可以创建多个绘图区(plt.subplots),在绘图区中可以画各种各样的图表。

1.2 辅助显示层

辅助显示层为Axes(绘图区)内的除了根据数据绘制出的图像以外的内容,主要包括Axes外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick)、坐标轴刻度标签(tick label)、网格线(grid)、图例legend)、标题(title)等内容。

1.3 图像层

图像层指Axes内通过plot、scatter、bar、histogram、pie等函数根据数据绘制出的图像,并且设置图像的风格。

2. 折线图

2.1 折线图绘制与保存图片

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

现在画一个简单的折线图:

# 绘制简单折线图展现上海一周的天气
import matplotlib.pyplot as plt
# 第一步:创建画布
plt.figure()
# 第二步:绘制图像
plt.plot([1,2,3,4,5,6,7],[17,17,18,15,11,11,13])
# 第三步:显示图像
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ocCddamq-1596548286867)(F:\JianShu_material\Python\Matplotlib的使用\001.png)]

在画布层,可以设置画布的属性(尺寸、清晰度)并且可以实现图片的保存:

  • figsize:画布的大小。
  • dpi:清晰度(dot per inch/每英寸多少点)。
  • plt.savefig(“path”):保存图片,path为图片保存路径。 注意:保存图片必须在plt.show()之前,因为plt.show()会释放figure资源,如果在显示图片之后保存图片,只能保存空图片。
# 绘制简单折线图展现上海一周的天气
import matplotlib.pyplot as plt

# 第一步:创建画布
# figsize:指定图的长宽
# dpi:图像的清晰度
plt.figure(figsize = (10,10),dpi = 100)

# 第二步:绘制图像
plt.plot([1,2,3,4,5,6,7],[17,17,18,15,11,11,13])

# 保存图片
plt.savefig("picture1.png")

# 第三步:显示图像
plt.show()

2.2 完善原始折线图1(辅助显示层)

现在根据需求完善折线图,需求:画出上海城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度-18度。

现在根据需求画出一个简单的折线图,分为四个步骤:

  1. 准备数据
  2. 创建画布
  3. 绘制图像
  4. 显示图像
# 需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度-18度。
import matplotlib.pyplot as plt
import random

# 第一步:准备数据
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x]

# 第二步:创建画布
plt.figure(figsize = (15,5),dpi = 80)

# 第二步:绘制图像
plt.plot(x, y_shanghai)

# 第三步:显示图像
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T1M0svEf-1596548286869)(F:\JianShu_material\Python\Matplotlib的使用\002.png)]

在辅助显示层我们可以进行修改的内容有:

  • 修改x和y轴的刻度使其更加符合我们的需求。plt.xsticks(x , ** kwargs)、plt.ysticks(y , ** kwargs),** kwargs是对其前面参数的补充说明。plt.tick_params(axis=‘both’, labelsize=14) 可以设置刻度的粗细。
  • 增加网格。plt.grid(True , linestyle = ‘–’ , alpha = 0.5)
  • 添加图标题、x轴标题、y轴标题以及它们的大小。plt.xlabel(" “, fontsize=24)、plt.ylabel(” “, fontsize=24)、plt.title(” ", fontsize=24)
  • 设置线条的粗细。plt.plot(linewidth = 5)
# 需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度-18度。
import matplotlib.pyplot as plt
import random

# 第一步:准备数据
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x]

# 第二步:创建画布
plt.figure(figsize = (15,7),dpi = 80)

# 第二步:绘制图像
# 参数linewidth代表折线的粗细
plt.plot(x, y_shanghai, linewidth = 5)

# 修改刻度
# format()函数是使()中的内容代替前面{}中的内容,可以多个代替
x_label = ["11点{}分".format(i) for i in x]
plt.xticks(x[::5], x_label[::5])
plt.yticks(range(0, 40, 5))
# 设置刻度的粗细
# 参数axis= 'both'、'x'、'y'
plt.tick_params(axis='both', labelsize = 14) 

# 添加网格
# True代表添加,可有可无;linestyle代表所添加网格的风格;alpha代表网格清晰度
plt.grid(True, linestyle = '--', alpha = 0.5 )

# 添加3种标题
# 参数fontsize代表标题的大小
plt.xlabel("时间", fontsize = 24)
plt.ylabel("温度", fontsize = 24)
plt.title("温度随时间变化图", fontsize = 30)

# 第三步:显示图像
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oqhjvyQe-1596548286876)(F:\JianShu_material\Python\Matplotlib的使用\003.png)]

2.3 完善原始折线图2(图像层)

现在更改需求,需求:画出上海和北京11点到12点1小时内每分钟的温度变化折线图,上海温度范围在15度-18度,北京温度范围在1度-5度。

更改这个需求十分简单,只需要在准备好北京市的数据,在画布层使用plt.plot(x, y_beijing),并修改一些参数即可。

# 需求:画出北京和上海11点到12点1小时内每分钟的温度变化折线图,上海温度范围在15度-18度,北京温度范围在1度-3度
import matplotlib.pyplot as plt
import random

# 第一步:准备数据
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x]
y_beijing = [random.uniform(1,3) for i in x]

# 第二步:创建画布
plt.figure(figsize = (15,7),dpi = 80)

# 第二步:绘制图像
# 参数linewidth代表折线的粗细
plt.plot(x, y_shanghai, linewidth = 5)
plt.plot(x, y_beijing, linewidth = 5)

# 修改刻度
# format()函数是使()中的内容代替前面{}中的内容,可以多个代替
x_label = ["11点{}分".format(i) for i in x]
plt.xticks(x[::5], x_label[::5])
plt.yticks(range(0, 40, 5))

# 设置刻度的粗细
# 参数axis= 'both'、'x'、'y'
plt.tick_params(axis='both', labelsize = 14)

# 添加网格
# True代表添加,可有可无;linestyle代表所添加网格的风格;alpha代表网格清晰度
plt.grid(True, linestyle = '--', alpha = 0.5 )

# 添加3种标题
# 参数fontsize代表标题的大小
plt.xlabel("时间", fontsize = 24)
plt.ylabel("温度", fontsize = 24)
plt.title("北京和上海温度随时间变化图", fontsize = 30)

# 第三步:显示图像
plt.show()

在图像层我们可以修改的内容有:

  • 线条颜色

  • 线条风格

  • 线条标签,显式图例

# 使用color来代表线条颜色
# 使用linestyle来代表线条的风格
# 要显示图例,两步骤:1.在plt.plot(lable = '上海'),2.添加plt.legend()
plt.plot(x, y_shanghai, linewidth = 5, color = 'r', linestyle = '--', lable = '上海')
plt.plot(x, y_beijing, linewidth = 5, color = 'b', linestyle = '-.', lable = '北京')

# 可以对()中的参数进行修改,改变图例位置
# 也可不添加,则默认位置为右上角
plt.legend(loc = 'best')

2.4 多个坐标显示-plt.subplots(面向对象的画图方法)

现在更改需求:要求在两个折线图中分别显示北京和上海的温度变化情况,这是由面向过程向面向对象的转变。

# 创建一个带有多个axes(坐标系)的图
# nrows代表有1行,默认为1
# ncols代表有2列,默认为1
# **fig_kw是对其它参数的设置
# 会返回两个参数,figure(画布)、axes(绘图区)
figure, axes = matplotlib.pyplot.subplots(nrow = 1, ncols = 2, **fig_kw)

# 注意:以前是plt.函数名()进行画图,现在为axes.方法名()进行画图
# axes[0]代表第一个折线图
# axes[1]代表第二个折线图
# 需求:分别画出北京和上海11点到12点1小时内每分钟的温度变化折线图,上海温度范围在15度-18度,北京温度范围在1度-3度
import matplotlib.pyplot as plt
import random

# 第一步:准备数据
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x]
y_beijing = [random.uniform(1,3) for i in x]

# 第二步:创建画布
# plt.figure(figsize = (15,7),dpi = 80)
fugure, axes = plt.subplots(nrows = 1, ncols = 2, figsize = (20,6), dpi = 80)

# 第二步:绘制图像
# 参数linewidth代表折线的粗细
axes[0].plot(x, y_shanghai, linewidth = 3, color = 'r', linestyle = '--', label = '上海')
axes[1].plot(x, y_beijing, linewidth = 3, color = 'b', linestyle = '-.', label = '北京')

# 显式图例
axes[0].legend(loc = 'best')
axes[1].legend(loc = 'best')

# 修改刻度
# format()函数是使()中的内容代替前面{}中的内容,可以多个代替
x_label = ["11点{}分".format(i) for i in x]
axes[0].set_xticks(x[::5])
axes[0].set_xticklabels(x_label[::5])
axes[0].set_yticks(range(0, 40, 5))
axes[1].set_xticks(x[::5])
axes[1].set_xticklabels(x_label[::5])
axes[1].set_yticks(range(0, 40, 5))

# 设置刻度的粗细
# 参数axis= 'both'、'x'、'y'
plt.tick_params(axis='both', labelsize = 14)

# 添加网格
# True代表添加,可有可无;linestyle代表所添加网格的风格;alpha代表网格清晰度
axes[0].grid(True, linestyle = '--', alpha = 0.5 )
axes[1].grid(True, linestyle = '--', alpha = 0.5 )

# 添加3种标题
# 参数fontsize代表标题的大小
axes[0].set_xlabel("时间", fontsize = 24)
axes[0].set_ylabel("温度", fontsize = 24)
axes[0].set_title("上海温度随时间变化图", fontsize = 30)
axes[1].set_xlabel("时间", fontsize = 24)
axes[1].set_ylabel("温度", fontsize = 24)
axes[1].set_title("北京温度随时间变化图", fontsize = 30)

# 第三步:显示图像
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GICZao5J-1596548286877)(F:\JianShu_material\Python\Matplotlib的使用\009.png)]

2.5 折线图应用场景

折线图反映某事物随某指标的变化情况,还可以画各种数学函数图像。

先画一个简单的函数:

import numpy as np
import matplotlib.pyplot as plt

# 准备x、y数据
# np.linspace的意思是将-1到1中平均分为1000个点,包括-1和1
x = np.linspace(-1, 1, 1000)
y = 2 * x * x

# 创建画布
plt.figure(figsize = (12,7), dpi = 80)

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

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

# 显示图像
plt.show()

3. 散点图

3.1 散点图的绘制

散点图可以探究不同变量的内在关系。

先画一个简单的散点图:

import matplotlib.pyplot as plt

# 准备x、y数据
x = [225.98,247.07,253.14,457.85,241.58,301.01,20.67,288.64,
163.56,120.06,207.83,342.75,147.9,53.06,224.72,29.51,
21.61,483.21,245.25,399.25,343.35]

y = [196.63,203.88,210.75,372.74,202.41,247.61,24.9,239.34,
140.32,104.15,176.84,288.23,128.79,49.64,191.74,33.1,
30.74,400.02,205.35,330.64,283.45]

# 创建画布
plt.figure(figsize = (12,7), dpi = 80)

# 绘制图像
plt.scatter(x, y)

# 显示图像
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fRiXMRp4-1596548286879)(F:\JianShu_material\Python\Matplotlib的使用\011.png)]

对于散点图的完善,我们可参照折线图:

  • 设置三大标题
  • 设置刻度的范围
  • 设置点的颜色与大小
  • 设置颜色的映射

4. 柱状图

4.1 柱状图的绘制

需求一:比较各个电影票房收入

import matplotlib.pyplot as plt

# 准备x、y数据
movie_names=['雷神3:诸神黄昏', '正义联盟', '东方快车谋杀案',
             '寻梦环游记', '全球风暴', '降魔传', '追捕',
             '七一', '少年派', '罗马假日', '阿甘正传']
tickets=[73853, 57767, 22354, 15969, 14839, 8725,
         8716, 8318, 7916, 6764, 52222]

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

# 绘制图像
# 首先输入横纵坐标
# width设置柱状图的宽度
# color设置相对应的颜色
plt.bar(movie_names, tickets, width=0.5, color=['b','r','g','y','c','m','y','k','c','g','b'])

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

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

# 显示图像
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-82m0agAT-1596548286881)(F:\JianShu_material\Python\Matplotlib的使用\012.png)]

需求二:比较同一时期电影票房收入

import matplotlib.pyplot as plt

# 准备x、y数据
movie_name = ['雷神3:诸神黄昏', '正义联盟', '寻梦环游记']
first_day = [10587.6,10062.5,1275.7]
first_weekend = [36224.9,34479.6,11830]

# 创建画布
plt.figure(figsize = (15,7), dpi = 80)

# 绘制图像
plt.bar(range(3), first_day, width = 0.2, label = '首日票房')
plt.bar([0.2, 1.2, 2.2], first_weekend, width = 0.2, label = '首周票房')

# 修改刻度
plt.xticks([0.1, 1.1, 2.1], movie_name)

# 显示图例
plt.legend()

# 添加标题
plt.title('首日和首周电影票房收入对比', fontsize = 30)

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

# 显示图像
plt.show()

5. 直方图

5.1 直方图与柱状图对比

  1. 直方图展示数据的分布,柱状图比较数据的大小。
  2. 直方图X轴为定量数据,柱状图X轴为分类数据。
  3. 直方图柱子无间隔,柱状图柱子有间隔。
  4. 直方图柱子宽度可不一,柱状图柱子宽度须一致。

5.2 直方图绘制

需求:电影分布时长状况

import matplotlib.pyplot as plt
import random

# 准备x、y数据
x = range(250)
time = [int(random.uniform(90,151)) for i in x]

# 创建画布
plt.figure(figsize = (15,7), dpi = 80)

# 绘制图像
# 组距
distance = 2
# 组数 = (最大值就 - 最小值 ) / 组距
group_num = int((max(time) - min(time)) / distance)
# time代表要统计的数据,bins代表组数
# density代表纵坐标是否用频率来表示,如果不填,则代表用频数表示
plt.hist(time, bins = group_num, density = True)

# 修改刻度
# 开始为min(time)、结尾为max(time) + 2、步幅为distance
plt.xticks(range(min(time), max(time) + 2, distance))

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

# 添加标题
plt.title('电影时长直方图', fontsize = 30)

# 显示图像
plt.show()

6. 饼图

6.1 饼图的绘制

需求:不同电影排片比例

import matplotlib.pyplot as plt


# 准备x、y数据
movie_names = ['雷神3:诸神黄昏', '正义联盟', '东方快车谋杀案',
             '寻梦环游记', '全球风暴']
# 排片数量
place_count = [73853, 57767, 22354, 15969, 8725]

# 创建画布
plt.figure(figsize = (15,7), dpi = 80)

# 绘制图像
# labels代表每部分的名称
# colors代表每部分的颜色
# autopct代表占比显示格式
plt.pie(place_count, labels = movie_names,
        colors = ['b','r','g','y','c'],
        autopct = '%1.2f%%')

# 显示图例
plt.legend()

# 为了让显示的饼图保持圆形,需要添加axis保证长宽一样
plt.axis('equal')

# 显示图像
plt.show()

7. 总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-goXp09Xu-1596548286883)(F:\JianShu_material\Python\Matplotlib的使用\016.png)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值