1 概述
2D绘图库,可生成直方图\功率图\条形图\散点图等
数据可视化
安装
Anaconda已集成了Matplotlib无需安装
安装:
pip install Matplotlib
或者官网->PyPI->下载whl文件
绘制基础
title 设置图标名称
xlabel x轴名称
ylabel y轴名称
xticks x轴刻度
yticks y轴刻度
plot 绘制线性图标
...
详见文档
绘制直线
result.png# coding=utf-8
import matplotlib.pyplot as plt
# 准备绘制的两个点
# (1,2) (4,8)
# 调用绘制方法plot
plt.plot([1, 4], [2, 8])
plt.show()
绘制折线
# coding=utf-8
import matplotlib.pyplot as plt
# 准备绘制点
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
plt.plot(x, y)
plt.show()
2 设置样式
result.png# coding=utf-8
import matplotlib.pyplot as plt
# 准备绘制点
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
# 设置宽度
plt.plot(x, y, linewidth=5)
# 添加x轴\y轴名称
plt.xlabel('x')
plt.xlabel('y=x^2')
# 解决中文标题乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
# 设置标题
plt.title('多个点设置折线图')
plt.show()
3 绘制曲线
绘制一元二次方程
y = x^2
result.png
# coding=utf-8
import matplotlib.pyplot as plt
# 准备绘制点
x = range(-100, 100)
y = [i**2 for i in x]
plt.plot(x, y)
# 保存图片,默认格式png
plt.savefig('result')
# 指定jpg格式
# plt.savefig('result.jpg')
plt.show()
异常:
保存为jpg时报错
ValueError: Format 'jpg' is not supported (supported formats: eps, pdf, pgf, png, ps, raw, rgba, svg, svgz)
绘制正弦和余弦曲线
sin_cos.png# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
# 生成0-10 100个等差数
x = np.linspace(0, 10, 100)
sin_y = np.sin(x)
# 绘制
plt.plot(x, sin_y)
cos_y = np.cos(x)
plt.plot(x, cos_y)
# 保存图片
plt.savefig('sin_cos')
plt.show()
3 subplot的使用
将画布分区域,将图画到指定的区域
result.png
# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
# 0-10 100数的等差数列
x = np.linspace(0, 10, 100)
sin_y = np.sin(x)
# 画布分为两行两列,画到第一个区
plt.subplot(2,2,1)
# 修改x轴\y轴的坐标范围
plt.xlim(-5, 20)
plt.ylim(-2, 2)
plt.plot(x, sin_y)
plt.subplot(2,2,3)
cos_y = np.cos(x)
plt.plot(x, cos_y)
plt.show()
4 散点图
scatter函数可绘制随机点
result.png
# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
sin_y = np.sin(x)
# 绘制正弦曲线
# plt.plot(x, sin_y)
# 绘制散点图
plt.scatter(x, sin_y)
# 使用plot绘制散点图,plot绘制图形的速度优于scatter
# 如果点的形式(大小\颜色)有差别,则使用scatter
# plt.plot(x, sin_y, 'o')
plt.show()
设置点的大小和颜色
result.png# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
# 绘制10种大小 100种颜色的散点图
# 执行多次每次获取的随机数相同
np.random.seed(0)
# 100个随机数,范围[0.0, 1,0)
x = np.random.rand(100)
y = np.random.rand(100)
# 10种大小
# size = np.random.rand(10)*1000
size = np.random.rand(100)*1000
# 100种颜色
color = np.random.rand(100)
# alpha表示透明度
plt.scatter(x, y, s=size, c=color, alpha=0.7)
plt.show()
异常
当大小size的个数小于点的个数时报错
ValueError: s must be a scalar, or the same size as x and y
5 绘制不同样式不同颜色的线条
result.png# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
# 绿色短横线,加图例
plt.plot(x, x+0, '--g', label='--g')
# 红色点横线
plt.plot(x, x+1, '-.r')
# 蓝色点横线
plt.plot(x, x+2, ':b')
# 其他样式参考文档
# 添加图例,默认位置左上角,可通过loc参数指定位置,其他参数参考文档
# 右下角
plt.legend(loc = "lower right")
plt.show()
6 绘制柱状图
result.png# coding=utf-8
import matplotlib.pyplot as plt
# x表示不同年份
x = [1980, 1985, 1990, 1995]
x_label = ['1980年', '1985年', '1990年', '1995年']
# y表示各年份销量
y = [1000, 3000, 4000, 5000]
# 绘制柱状图, width参数是原宽度的3倍
plt.bar(x, y, width=3)
# 修改x坐标的值
plt.xticks(x, x_label)
# 解决中文乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
# x轴 y轴添加名称
plt.xlabel('年份')
plt.ylabel('销量')
# 标题
plt.title('年份销量对比图')
plt.show()
7 barh函数
barh水平绘制柱状图
result.png
# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np![result.png](https://img.haomeiwen.com/i5880229/71fcdc6d74ee5f1d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
# 1-4
x = np.arange(5)
# -5-5 5个随机数
y = np.random.randint(-5, 5, 5)
# 画布分为1行2列, 第一个区域画bar
plt.subplot(1,2,1)
# color设置颜色
plt.bar(x, y, color='blue')
# 水平0位置加线条
plt.axhline(0, color='blue', linewidth=2)
plt.subplot(1,2,2)
# barh将x\y轴对调
plt.barh(x, y, color='red')
# 垂直0位置加线条
plt.axvline(0, color='red', linewidth=2)
plt.show()
对不同的柱设置不同颜色
result.png# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
# 1-4
x = np.arange(5)
# -5-5 5个随机数
y = np.random.randint(-5, 5, 5)
# color设置颜色
v_bar = plt.bar(x, y, color='blue')
# y大于0时设置为蓝色,小于0时设置为绿色
for bar, height in zip(v_bar,y):
if height < 0:
bar.set(color='green')
# 保存图片
plt.savefig('result')
plt.show()
8 柱状图实例
统计票房
result.png# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
# 电影名称
real_names = ['千与千寻', '玩具总动员4', '黑衣人:全球追缉']
real_nums1 = [7548, 4013, 1673]
real_nums2 = [5453, 1840, 1080]
real_nums3 = [4348, 2345, 1890]
x = np.arange(len(real_names))
width=0.3
plt.bar(x, real_nums1, alpha=0.5, width=0.3, label=real_names[0])
plt.bar([i+width for i in x], real_nums2, alpha=0.5, width=width, label=real_names[1])
plt.bar([i+2*width for i in x], real_nums3, alpha=0.5, width=width, label=real_names[2])
# 解决中文标题乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
x_label = ['第{}天'.format(i+1) for i in x]
# 设置x坐标的值
plt.xticks([i+width for i in x], x_label)
# 添加纵坐标
plt.ylabel('票房数')
# 添加图例
plt.legend()
# 添加标题
plt.title('三天内电影票房数')
plt.show()
9 饼状图
result.png# coding=utf-8
import matplotlib.pyplot as plt
# 男女人数及比例
man = 71351
woman = 68187
man_perc = man/(woman+man)
woman_perc = woman/(woman+man)
# 添加名称
labels = ['男', '女']
# 解决中文标题乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
# 设置颜色
colors = ['blue', 'red']
# 绘制饼图 explode饼图分裂 autopct显示百分比 labels名称 colors颜色
paches, texts, autotexts = plt.pie([man_perc, woman_perc], labels=labels, colors=colors, explode=(0, 0.05), autopct='%0.1f%%')
# 设置字体颜色
for text in autotexts:
text.set_color('white')
# 设置字体大小
for text in texts+autotexts:
text.set_fontsize(20)
# 保存图片
plt.savefig('result')
plt.show()
10 直方图
直方图关注的是分布的状态,不关注具体的某个值
result.png
# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
# 生成1000个标准正态分布随机数
x = np.random.randn(1000)
# 绘制直方图
# plt.hist(x)
# 绘制直方图 修改柱宽 10个柱装在一起
plt.hist(x, bins=100)
# 保存图片
plt.savefig('result')
plt.show()
normal指定期望\方差\均值
result.png
# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
# 生成1000个 期望0 均值0.8
x = np.random.normal(0, 0.8, 1000)
y = np.random.normal(-2, 1, 1000)
z = np.random.normal(3, 2, 1000)
kwargs=dict(bins=100, alpha=0.5)
# 绘制直方图
plt.hist(x, **kwargs)
plt.hist(y, **kwargs)
plt.hist(z, **kwargs)
# 保存图片
plt.savefig('result')
plt.show()
11 等高线图 | 三维图
等高线图
result.png# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10, 10, 100)
y = np.linspace(-10, 10, 100)
# 计算x/y相交的点
X, Y = np.meshgrid(x, y)
# 计算Z
Z = np.sqrt(X**2+Y**2)
# 绘制等高线图
plt.contour(X, Y, Z)
# 颜色填充
# plt.contourf(X, Y, Z)
# 保存图片
plt.savefig('result')
plt.show()
三维图
result.png# coding=utf-8
import matplotlib.pyplot as plt
# 导入3D包
from mpl_toolkits.mplot3d import Axes3D
# 创建X Y Z
X = [1, 1, 2, 2]
Y = [3, 4, 4, 3]
Z = [1, 100, 1, 1]
figure=plt.figure()
ax = Axes3D(figure)
ax.plot_trisurf(X, Y, Z)
# 保存图片
plt.savefig('result')
plt.show()
异常:
图形无法拖动旋转,提示
UserWarning: This figure includes Axes that are not compatible with tight_layout, so results might be incorrect.
网友评论