matplotlib是最常用的Python包的二维图形,它提供了一种非常快速的方式来从Python可视化数据和以多种格式发布质量数据。
英文教程:Matplotlib: Python plotting — Matplotlib 2.2.2 documentation
中文教程:Matplotlib 中文用户指南 3.1 pyplot 教程 - CSDN博客
Matplotlib安装使用与详细解读,轻松学Matplotlib入门教程-Matplotlib中文文档
Matplotlib总体来说包含两类元素:
- 基础类:线line、点marker、文字text、图例legend、网格grid、标题title、图片image
- 容器类:图figure、坐标系axes、坐标轴axis、刻度tick
1.matplotlib.pyplot.plot()函数
pyplot
是matplotlib的面向对象的绘图库,plot()
是一个通用命令,可接受任意数量的参数。
import matplotlib.pyplot as plt
# 设置格式样例
print(plt.style.available)
matplotlib.style.use('bmh')
# 设置中文识别
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
# 1.如果提供单个列表或数组,则matplotlib假定它是一个y值序列,并自动生成x值。由于python 范围从 0 开始,默认x向量具有与y相同的长度,因此x数据是[0,1,2,3]
plt.plot([1,2,3,4])
# 2.绘制x和y
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
# 3."b-"、"ro"、"r--"、"bs"、"g^"表示图形颜色和线条类型
# 4.linewidth 设置线宽
plt.plot([1,2,3,4], [1,4,9,16], 'ro',linewidth=2.0)
# 5.axis()命令接收[xmin,xmax,ymin,ymax],指定x,y轴区域范围
plt.axis([0, 6, 0, 20])
# 6.设置标签xlabel()x轴添加文字,ylabel()y轴添加文字,text()任意位置添加文字
plt.ylabel('some numbers', fontsize=14, color='red')
# 7.显示网格
plt.grid(True)
plt.show()
2.标注文本
text()
基本命令将文本放置在轴域的任意位置,annotate()
方法提供标注。 在标注中,有两个要考虑的点:由参数xy
表示的标注位置和xytext
表示的文本位置。 这两个参数都是(x, y)
元组。
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = ax.plot(t, s, lw=2)
ax.annotate('标注', xy=(2,1), xytext=(3,1.5),arrowprops=dict(facecolor='black', shrink=0.05),)
ax.set_ylim(-2,2)
plt.show()
3.基本图形
3.1 饼图
import matplotlib.pyplot as plt
import matplotlib
# 设置中文识别
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
# 设置可以显示负数
matplotlib.rcParams['axes.unicode_minus'] = False
# labels (每一块)饼图外侧显示的说明文字
labels=['第一部分','第二部分','第三部分','第四部分']
# (每一块)的比例
sizes=[15,20,55,10]
colors=['yellowgreen','gold','lightskyblue','lightcoral']
# explode (每一块)离开中心距离
explode=[0,0.1,0,0]
# shadow 是否阴影
# autopct 控制饼图内百分比设置,可以使用format字符串或者format function ,'%1.1f'指小数点前后位数(没有用空格补齐)
# 画饼图用到的方法为:matplotlib.pyplot.pie()
plt.pie(sizes,explode=explode,labels=labels,colors=colors,autopct='%1.1f%%',shadow=True,startangle=50)
# 设置横轴和纵轴大小相等,这样饼才是圆的
plt.axis('equal')
# 设置注释
plt.legend()
plt.show()
3.2 堆叠条形图
import matplotlib.pyplot as plt
import matplotlib
# 横轴名称
label_list = ['2014', '2015', '2016', '2017']
# 第一堆叠值
num_list1 = [20, 30, 15, 35]
# 第二堆叠值
num_list2 = [15, 30, 40, 20]
x = range(len(num_list1))
rects1 = plt.bar(x, height=num_list1, width=0.45, alpha=0.8, color='red', label="一部门")
rects2 = plt.bar(x, height=num_list2, width=0.45, color='green', label="二部门", bottom=num_list1)
plt.ylim(0, 80)
# 纵轴
plt.ylabel("数量")
plt.xticks(x, label_list)
# 横轴
plt.xlabel("年份")
# 标题
plt.title("某某公司")
# 显示注释
plt.legend()
plt.show()
3.3 水平条形图
import matplotlib.pyplot as plt
import matplotlib
price = [39.5, 39.9, 45.4, 38.9, 33.34]
# 绘制水平条形图方法barh()
plt.barh(range(5), price, height=0.7, color='steelblue', alpha=0.8)
#从下往上画
plt.yticks(range(5), ['亚马逊', '当当网', '中国图书网', '京东', '天猫'])
# 设置图形起始值
plt.xlim(30,47)
plt.xlabel("价格")
plt.title("不同平台图书价格")
for x, y in enumerate(price):
plt.text(y + 0.2, x - 0.1, '%s' % y)
plt.show()
3.4 条形图
import matplotlib.pyplot as plt
import matplotlib
label_list = ['2014', '2015', '2016', '2017'] # 横坐标刻度显示值
num_list1 = [20, 30, 15, 35] # 纵坐标值1
num_list2 = [15, 30, 40, 20] # 纵坐标值2
x = range(len(num_list1))
"""
绘制条形图
left:长条形中点横坐标
height:长条形高度
width:长条形宽度,默认值0.8
label:为后面设置legend准备
"""
rects1 = plt.bar(x, height=num_list1, width=0.4, alpha=0.8, color='red', label="一部门")
rects2 = plt.bar([i + 0.4 for i in x], height=num_list2, width=0.4, color='green', label="二部门")
plt.ylim(0, 50) # y轴取值范围
plt.ylabel("数量")
"""
设置x轴刻度显示值
参数一:中点坐标
参数二:显示值
"""
plt.xticks([index + 0.2 for index in x], label_list)
plt.xlabel("年份")
plt.title("某某公司")
plt.legend() # 设置题注
# 编辑文本
for rect in rects1:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom")
for rect in rects2:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom")
plt.show()
3.5 直方图
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
# 随机生成(10000,)服从正态分布的数据
data = np.random.randn(10000)
"""
绘制直方图
data:必选参数,绘图数据
bins:直方图的长条形数目,可选项,默认为10
normed:是否将得到的直方图向量归一化,可选项,默认为0,代表不归一化,显示频数。normed=1,表示归一化,显示频率。
facecolor:长条形的颜色
edgecolor:长条形边框的颜色
alpha:透明度
"""
plt.hist(data, bins=20, normed=0, facecolor="green", edgecolor="black", alpha=0.7)
# 显示横轴标签
plt.xlabel("区间")
# 显示纵轴标签
plt.ylabel("频数/频率")
# 显示图标题
plt.title("频数/频率分布直方图")
plt.show()
3.6 折线图
import matplotlib.pyplot as plt
x1=range(0,10)
x2=range(0,10)
y1=[10,13,5,40,30,60,70,12,55,25]
y2=[5,8,0,30,20,40,50,10,40,15]
plt.plot(x1,y1,label='第一条线',linewidth=2,color='r',marker='o',markerfacecolor='blue',markersize=12)
plt.plot(x2,y2,label='第二条线')
plt.xlabel('Plot Number')
plt.ylabel('Important var')
plt.title('有趣的图形')
plt.legend()
plt.show()
3.7 散点图
import matplotlib.pyplot as plt
population_ages = [22,55,62,45,21,22,34,42,42,4,99,102,
110,120,121,122,130,111,115,112,80,75,
65,54,44,43,42,48]
x=range(0,len(population_ages))
plt.scatter(x,population_ages,label='第一变量',s=20)
# help(plt.scatter)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck it out')
plt.legend()
plt.show()
3.8 自定义函数
import matplotlib.pyplot as plt
import numpy as np
# 从[-1,1]中等距去50个数作为x的取值
x = np.linspace(0, 10, 50)
# 一次函数
y1 = 2*x + 1
# 二次函数
y2 = 2**x + 1
# 三次函数
y3 = 2**x*x + 1
# 第一个是横坐标的值,第二个是纵坐标的值
# plt.plot(x, y)
# 注意,每次调用figure的时候都会重新申请一个figure对象
plt.figure()
# 第一个是横坐标的值,第二个是纵坐标的值
plt.plot(x, y1)
# 第一个参数表示的是编号,第二个表示的是图表的长宽
plt.figure(num = 3, figsize=(6, 5))
# 当我们需要在画板中绘制两条线的时候,可以使用下面的方法:
plt.plot(x, y2)
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
# 设置轴线的lable(标签)
plt.xlabel("I am x")
plt.show()
3.9 3D数据图
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(12, 8))
ax = Axes3D(fig)
# 生成X,Y
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X,Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
# height value
Z = np.sin(R)
# 绘图
# rstride(row)和cstride(column)表示的是行列的跨度
ax.plot_surface(X, Y, Z,
rstride=1, # 行的跨度
cstride=1, # 列的跨度
cmap=plt.get_cmap('rainbow') # 颜色映射样式设置
)
# offset 表示距离zdir的轴距离
ax.contourf(X, Y, Z, zdir='z', cmap='rainbow')
ax.set_zlim(-2, 2)
plt.show()
3.10 Subplot多合一显示
import matplotlib.pyplot as plt
import numpy as np
plt.figure()
# 将整个figure分成两行两列
plt.subplot(2, 2, 1)
# 第一个参数表示X的范围,第二个是y的范围
plt.plot([0, 1], [0, 1])
plt.subplot(222)
plt.plot([0, 1], [0, 2])
plt.subplot(223)
plt.plot([0, 1], [0, 3])
plt.subplot(224)
plt.plot([0, 1], [0, 4])
plt.show()
3.11 subplot2grid分格显示
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.gridspec as gridspec
plt.figure()
# 第一个元素表示将总的面板进行划分,划分为3行3列,
# 第二个元素表示该面板从0行0列开始,列的跨度(colspan)为3列,行的跨度(rowspan)为1
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3, rowspan=1)
# 第一个元素的表示X的范围为[1,2],第二个元素表示Y的范围为[1,2]
ax1.plot([1, 2], [1, 2])
ax1.set_title(r'$ax1\_title$')
# 第一个元素表示将总的面板进行划分,划分为3行3列,
# 第二个元素表示该面板从1行0列开始,列的跨度(colspan)为2列,行的跨度(rowspan)取默认值1
ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2)
ax2.set_title(r'$ax2\_title$')
# 第一个元素表示将总的面板进行划分,划分为3行3列,
# 第二个元素表示该面板从1行2列开始,行的跨度(rowspan)为2列,列的跨度(colspan)取默认值1
ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
ax3.set_title(r'$ax3\_title$')
# 第一个元素表示将总的面板进行划分,划分为3行3列,
# 第二个元素表示该面板从2行0列开始,行的跨度(rowspan)为2列,列的跨度(colspan)取默认值1
ax4 = plt.subplot2grid((3, 3), (2, 0))
ax4.set_title(r'$ax4\_title$')
# 第一个元素表示将总的面板进行划分,划分为3行3列,
# 第二个元素表示该面板从2行1列开始,行的跨度(rowspan)为2列,列的跨度(colspan)取默认值1
ax5 = plt.subplot2grid((3, 3), (2, 1))
ax5.set_title(r'$ax5\_title$')
plt.tight_layout()
plt.show()