Matplotlib的基本元素:
1,变量
2,函数
3,画布(figure)
4,坐标轴(axes)
绘图过程:变量和函数通过改变figure和axes中的元素(如:title,label)一起描述figure和axes
Matplotlib的图像位于figure对象中
通过plt.figure()创建
如果没有指定创建,matplotlib会自动生成默认的画布
参数figsize用来控制画布的大小,单位为英寸(inch), 1 inch = 2.54 cm
用plt.show()显示绘图结果
注意的是,在jupyter notebook中使用matplotlib时,代码块需要放在一个cell中
import matplotlib.pyplot as plt import numpy as np plt.figure() # 创建画布 Out[19]: <Figure size 640x480 with 0 Axes> data = [2,4,6,8,10] #构造数据 # 可视化数据 plt.plot(data) #plot是绘制折线 Out[21]: [<matplotlib.lines.Line2D at 0xc35eb10>] plt.show()
plt.figure(figsize=(15, 6)) # 控制画布大小 plt.plot(np.random.randn(100)) plt.show()
①散点图:
plt.scatter(x, y, s,c,marker) # s,c,marker有默认值
* x 横轴的数据
* y 纵轴的数据
* s点的大小,标量或数组 →标量:同时所有点的大小(颜色)
* c点的颜色,标量或数组→数组:为每一个点设置不同的大小(颜色)
* marker点的样式
②柱状图:
plt.bar(x,xheight,color)
* x柱子的横坐标
*height 柱子的高度(数据)
*color柱子的颜色
注意:绘制多组柱状图时,需要设置不同的横坐标,防止重叠
x1 = [1,3,5,7,9] data1=[5,2,7,8,2] plt.bar(x1,data,color='r') x2 = np.array(x1)+1 # 设置不同的横坐标防止覆盖 plt.bar(x2, np.array(data1)+2, color='g') plt.show()
要求在同一个画布上绘制A同学和B同学的成绩,设置画布的大小为10*5,柱子的宽度为0.5,绘制图例,A同学的柱子颜色用红色表示,B同学柱子的颜色用蓝色表示,x轴标签是year,y轴标签为score。 plt.figure(figsize=(10,5)) year=["2016","2017","2018","2019"] x_A=[1,3,5,7] score_A = [40,50,59,60] w =0.5 plt.bar(x_A,score_A,(1)=w,label="A") x_B=np.array(x_A)+w score_B = [50,70,80,90] plt.bar(x_B,(2),width=w,(3)="B") plt.xlabel("year") plt.(4)("score") plt.legend() plt.xticks(x_B-0.25,year) plt.show()
填空(1): 正确答案 width 填空(2): 正确答案 score_B 填空(3): 正确答案 label 填空(4): 正确答案 ylabel
③直方图:
形式类似于柱状图
* 通过将数据组合在一起来显示分布,比如:显示各年龄段的数据个数plt.hist(x, bins, rwidth)
* x 数据•rwidth柱子宽度比例,默认为1
* bins 分组的个数或分组边界,如4或[20, 30, 40, 50, 60]
*** 除了最后一组,其余组的右边界是开放的[20, 30), [30, 40), [40, 50), [50, 60]
import matplotlib.pyplot as plt ages = [22,23,26,21,34,36,29,19,24,35,42,48,33,22,45] bins = 5 # 分为5组 plt.hist(ages, bins) plt.show()
import matplotlib.pyplot as plt ages = [22,23,26,21,34,36,29,19,24,35,42,48,33,22,45] bins = [15,25,35,45,55] plt.hist(ages, bins, histtype='bar', rwidth=0.5) plt.show()
柱子变窄了
④子图:
子图是什么意思呢,就是在一张图中绘制多个图
看一个例子:
import matplotlib.pyplot as plt import numpy as np import pandas as pd fig, subplot_arr = plt.subplots(2,2,figsize=(8,8)) subplot_arr[0,0].scatter(np.random.randn(50), np.random.randn(50)*2) subplot_arr[0,1].bar([1,2,3,4,5], [5,2,7,8,2]) subplot_arr[1,0].hist(np.random.randn(50), bins=10, rwidth=0.8) subplot_arr[1,1].imshow(np.random.randn(5,5)) plt.show()
成图如下:
那如果共享x轴
import matplotlib.pyplot as plt import numpy as np import pandas as pd fig, subplot_arr = plt.subplots(2,2,figsize=(8,8), sharex=True) # 共享x轴 subplot_arr[0,0].scatter(np.random.randn(50), np.random.randn(50)*2) subplot_arr[0,1].bar([1,2,3,4,5], [5,2,7,8,2]) subplot_arr[1,0].hist(np.random.randn(50), bins=10, rwidth=0.8) subplot_arr[1,1].imshow(np.random.randn(5,5)) plt.show()
共享y轴:
import matplotlib.pyplot as plt import numpy as np import pandas as pd fig, subplot_arr = plt.subplots(2,2,figsize=(8,8), sharey=True) # 共享y轴 subplot_arr[0,0].scatter(np.random.randn(50), np.random.randn(50)*2) subplot_arr[0,1].bar([1,2,3,4,5], [5,2,7,8,2]) subplot_arr[1,0].hist(np.random.randn(50), bins=10, rwidth=0.8) subplot_arr[1,1].imshow(np.random.randn(5,5)) plt.show()
看个练习:
使用subplots生成4子图,第一个子图ax[0,0]对x数据进行可视化,第二个子图ax[0,1]对np.sin(x)的数据进行显示,第三个子图ax[1][0]对np.cos(x)数据进行显示,第四个子图ax[1][1]对x的平方进行显示,并且,子图公用x轴。 fig,ax = plt.subplots((1),2,sharex=(2)) x = [0,90,180,270,360,450] data=[np.array(x),np.sin(x),np.cos(x),np.array(x)**2] for i in range(2): for j in range(2): if i==0: ax[i][j].plot(x,data[i+j]) else: ax[i][j].plot(x,data[i+j+1]) plt.show() 填空(1): 正确答案 2, 你的答案 2。 填空(2): 正确答案 True, 你的答案 True。 回答正确。 收藏 展开解析 2 50.0分 在一个画布上绘制两个子图,其中第一个子图的title设置为title0,第二个子图的title设置为title1,并且设置子图共用一个y轴。 x = np.random.randint(1,10,size=8) y = np.sin(x) fig, ax = plt.(1)(nrows=1,ncols=2,(2)=True) plot_method = [] i=0 for col in ax: col.plot(x, y) col.set_title('title'+str((3))) col.set_xlabel('x-axis') i+=1 plt.show() 》》》》 填空(1): 正确答案 subplots。 填空(2): 正确答案 sharey 填空(3): 正确答案 i
matplotlib颜色,标记和线型
先看个示例:
fig, subplot_arr = plt.subplots(2,2,figsize=(8,8)) data = np.random.randn(20) subplot_arr[0,0].plot(data,'r.--') subplot_arr[0,1].plot(data,'gv:') subplot_arr[1,0].plot(data,'b<-') subplot_arr[1,1].plot(data,'ys-.') plt.show()
他的灵活性在于fmt参数值得顺序可以颠倒,甚者缺失部分
matplotlib的坐标刻度标签,图例,标题
在xtick上需要传入的是两个列表,第一个用来标识真实值,第二个指的是标签
但是需要注意的是,在Linux上面是不管用的,需要指定其他字体
data1 = np.random.randn(1000).cumsum() data2 = np.random.randn(1000).cumsum() data3 = np.random.randn(1000).cumsum() # 基本显示 plt.figure() plt.plot(data1) plt.plot(data2) plt.plot(data3) plt.show()
使用plt
data1 = np.random.randn(1000).cumsum() data2 = np.random.randn(1000).cumsum() data3 = np.random.randn(1000).cumsum() # 基本显示 # plt.figure() # plt.plot(data1) # plt.plot(data2) # plt.plot(data3) # plt.show() # 使用plt配置 plt.figure() plt.xlim([0,500])#设置刻度宽度 plt.xticks([0,100,200], ['x', 'xx', 'xxx'])#设置自定义的刻度 #设置坐标轴标签 plt.xlabel('Number') plt.ylabel('Random') #设置标题 plt.title('Example') #图例 plt.plot(data1) plt.plot(data2, label='line2') plt.plot(data3, label='line3') plt.legend(loc='best') plt.show()
使用ax
fig, ax = plt.subplots(1) ax.plot(data1, label='line1') ax.plot(data2, label='line2') ax.plot(data3, label='line3') #设置刻度 ax.set_xlim([0,800]) #设置显示的刻度 ax.set_xticks([0,100, 200, 300, 400,500]) #设置坐标轴标签 ax.set_xticklabels(['x1', 'x2', 'x3', 'x4', 'x5']) #设置坐标轴标签 ax.set_xlabel('Number') ax.set_ylabel('Random') #设置标题 ax.set_title('Examples2') plt.show()