目录
本文主要参考matploylib官方文档以及黑马程序员数据处理的视频。
pyplot简介
matplotlib.pyplot是使matplotlib像MATLAB一样工作的命令样式函数的集合。每个pyplot
功能都会对图形进行一些更改:例如,创建图形,在图形中创建绘图区域,在绘图区域中绘制一些线条,用标签装饰绘图等。
使用pyplot生成可视化效果非常快:
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4])
plt.ylabel('some numbers')
plt.show()
如果为plot()命令提供单个列表或数组 ,则matplotlib假定它是y值的序列,并自动生成x值。由于python范围从0开始,因此默认x向量的长度与y相同,但从0开始。因此x数据为 。[0, 1, 2, 3]
plot()是一个通用命令,它将接受任意数量的参数。例如,要绘制x与y的关系,可以发出以下命令:
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
显示中文字符
matplotlib.pyplot默认是不支持中文字符的,最简单的方法就是在代码前添加如下命令:
plt.rcParams['font.sans-serif']=['SimHei']
也可以使用frontname='SimHei',或设置字典等方式实现中文字符的显示。
格式化绘图样式
对于每对x,y参数,都有一个可选的第三个参数,它是表示图的颜色和线条类型的格式字符串。格式字符串的字母和符号来自MATLAB,您将颜色字符串与线条样式字符串连接在一起。默认格式字符串是“ b-”,这是一条蓝色实线。例如,要用红色圆圈绘制以上内容,您将发出
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro')
plt.axis([0, 6, 0, 20]) #[xmin, xmax, ymin, ymax]
plt.show()
如果matplotlib仅限于使用列表,则对于数字处理将毫无用处。通常,都会使用numpy数组。实际上,所有序列都在内部转换为numpy数组。下面的示例说明了使用数组在一条命令中绘制几行具有不同格式样式的行。
import numpy as np
# evenly sampled time at 200ms intervals
t = np.arange(0., 5., 0.2)
# red dashes, blue squares and green triangles
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()
图片大小设置与保存
x = range(2,12,2)
y = [3,6,2,7,8]
#设置图片大小,像素
plt.figure(figsize=(10,4),dpi=70)
#绘制折线图,颜色为红色,线宽为2,透明度为0.5
plt.plot(x,y,'r',label='line 1',linewidth=2,alpha=0.5)
#绘制蓝色点
plt.plot(x,y,'bo')
#保存图片
plt.savefig("./image.png")
#显示图片
plt.show()
刻度设置
直接举个例子
x = range(2,12,2)
y = [3,6,2,7,8]
#设置图片大小,像素
plt.figure(figsize=(10,4),dpi=90)
#绘制折线图,颜色为红色,线宽为2,透明度为0.5
plt.plot(x,y,'r',label='line 1',linewidth=2,alpha=0.5)
#绘制蓝色点
plt.plot(x,y,'bo',label ='point')
#添加图例,不然线条的label不会显示
plt.legend()
#设置刻度
x_label = ["1月{}号".format(i) for i in x]
plt.xticks(range(2,12,2),x_label,fontname='SimHei',rotation=45)#fontsize可设置字体大小
plt.yticks(range(0,10))
#保存图片
plt.savefig("./image.png")
#显示图片
plt.show()
用关键字字符串绘图
在某些情况下,您拥有某种格式的数据,该格式允许您使用字符串访问特定变量。Matplotlib允许您为此类对象提供data
关键字参数。如果提供的话,您可以使用与这些变量相对应的字符串生成图。
data = {'a': np.arange(50),
'c': np.random.randint(0, 50, 50),
'd': np.random.randn(50)}
data['b'] = data['a'] + 10 * np.random.randn(50)
data['d'] = np.abs(data['d']) * 100
plt.scatter('a', 'b', c='c', s='d', data=data)
plt.xlabel('entry a')
plt.ylabel('entry b')
plt.show()
用分类变量绘图
Matplotlib允许将类别变量直接传递给许多绘图函数。例如:
names = ['group_a', 'group_b', 'group_c']
values = [1, 10, 100]
plt.figure(figsize=(9, 3))
plt.subplot(131)
plt.bar(names, values)
plt.subplot(132)
plt.scatter(names, values)
plt.subplot(133)
plt.plot(names, values)
plt.suptitle('Categorical Plotting')
plt.show()
使用文本&绘制直方图
该texy()命令可用于在任意位置添加文本,xlabel(),ylabel(),title()可用于在指示的位置添加文本
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
# the histogram of the data
n, bins, patches = plt.hist(x, 50, density=1, facecolor='g', alpha=0.75)
#x轴名称
plt.xlabel('Smarts')
#y轴名称
plt.ylabel('Probability')
#图片名称
plt.title('Histogram of IQ')
#设置文本信息
plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
#设置刻度
plt.axis([40, 160, 0, 0.03])
#显示网格
plt.grid(True)
plt.show()
注释文字
我们使用annotate()方法来完成注释。在注释中,有两点需要考虑:由参数表示的要注释xy
的位置和text的位置xytext
。这两个参数都是元组(x, y)。
ax = plt.subplot(111)
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = plt.plot(t, s, lw=2)
plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),
arrowprops=dict(facecolor='black', shrink=0.05),
)
plt.ylim(-2, 2)
plt.show()
绘制散点图
plt.rcParams['font.sans-serif']=['SimHei']
y_3 = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
y_10 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
x_3 = range(1,32)
x_10 = range(51,82)
#设置图形大小
plt.figure(figsize=(15,6),dpi=80)
#使用scatter方法绘制散点图,和之前绘制折线图的唯一区别
plt.scatter(x_3,y_3,label="3月份")
plt.scatter(x_10,y_10,label="10月份")
#调整x轴的刻度
_x = list(x_3)+list(x_10)
_xtick_labels = ["3月{}日".format(i) for i in x_3]
_xtick_labels += ["10月{}日".format(i-50) for i in x_10]
plt.xticks(_x[::3],_xtick_labels[::3],fontname='SimHei',fontsize=15,rotation=45)
plt.yticks(fontsize=20)
#添加图例
plt.legend(loc="upper left",fontsize=20)
#添加描述信息
plt.xlabel("时间",fontname='SimHei',fontsize=20)
plt.ylabel("温度",fontname='SimHei',fontsize=20)
plt.title("标题",fontname='SimHei',fontsize=20)
#展示
plt.show()
绘制条形图
a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛",
"极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来",
"悟空传","银河护卫队2","情圣","新木乃伊",]
b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
#设置图形大小
plt.figure(figsize=(20,8),dpi=80)
#绘制条形图barh为横向条形图,bar为纵向条形图
plt.barh(range(len(a)),b,height=0.3,color="orange")
#设置字符串到x轴
plt.yticks(range(len(a)),a)
#显示网格
plt.grid(alpha=0.3)
plt.show()
多个条形图组合:
a = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]
bar_width = 0.2
x_14 = list(range(len(a)))
x_15 = [i+bar_width for i in x_14]
x_16 = [i+bar_width*2 for i in x_14]
#设置图形大小
plt.figure(figsize=(20,8),dpi=80)
plt.bar(range(len(a)),b_14,width=bar_width,label="9月14日")
plt.bar(x_15,b_15,width=bar_width,label="9月15日")
plt.bar(x_16,b_16,width=bar_width,label="9月16日")
#设置图例
plt.legend(fontsize=16)
#设置x轴的刻度
plt.xticks(x_15,a,fontsize=20)
plt.yticks(fontsize=20)
plt.show()
对数轴和其他非线性轴
matplotlib.pyplot不仅支持线性轴刻度,还支持对数和对数刻度。如果数据跨多个数量级,则通常使用此方法。更改轴的比例很容易:
plt.xscale('log')
下面显示了四个图的示例,这些图的y轴数据相同且比例不同。
from matplotlib.ticker import NullFormatter # useful for `logit` scale
# Fixing random state for reproducibility
np.random.seed(19680801)
# make up some data in the open interval (0, 1)
y = np.random.normal(loc=0.5, scale=0.4, size=1000)
y = y[(y > 0) & (y < 1)]
y.sort()
x = np.arange(len(y))
# plot with various axes scales
plt.figure()
# linear
plt.subplot(221)
plt.plot(x, y)
plt.yscale('linear')
plt.title('linear')
plt.grid(True)
# log
plt.subplot(222)
plt.plot(x, y)
plt.yscale('log')
plt.title('log')
plt.grid(True)
# symmetric log
plt.subplot(223)
plt.plot(x, y - y.mean())
plt.yscale('symlog', linthreshy=0.01)
plt.title('symlog')
plt.grid(True)
# logit
plt.subplot(224)
plt.plot(x, y)
plt.yscale('logit')
plt.title('logit')
plt.grid(True)
# Adjust the subplot layout, because the logit one may take more space
# than usual, due to y-tick labels like "1 - 10^{-3}"
plt.subplots_adjust(top=0.92, bottom=0.08, left=0.10, right=0.95, hspace=0.25,
wspace=0.35)
plt.show()