一、基础知识
1、简介
matplotlib是模仿matlab绘图工具开发的一个开源 python 库。python的其它第三方绘图库都依赖于matplotlib。
数据分析工作中的绘图更多的是帮助我们理解业务,而不是美观,否则就会使用一些Bi工具了。
2、基础代码
导入库
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#用来让py显示生成的图形,不用每次绘图后运行plt.show()
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
3、绘制图形:通用
生成变量数据
x=np.linspace(0,2*np.pi,100)
y=np.sin(x)
y1=np.cos(x)
matplotlib生成画布元素
plt.title('hellow,world!')
plt.plot(x,y)
plt.plot(x,y1)
#如果没有上面的%matplotlib inline代码,则每次生成画布元素后,都需要运行plt.show(),以显示图形。
输出结果:正弦和余弦图像
绘制两个画板
plt.subplot()使用方法以及参数介绍
plt.subplot(abc) #a:行数,b:列数,c:索引。三个数字都不能超过10
#等价于plt.subplot(a,b,c)
#索引值的意思是把它放在第几个位置。下面有示例
X = np.linspace(0, 2*np.pi,100)
Y = np.sin(X)
Y1 = np.cos(X)
plt.subplot(211)
plt.plot(X,Y)
plt.subplot(212)
plt.plot(X,Y1,color = 'r')
输出结果:
image.png
x=np.linspace(0,2*np.pi,100)
y=np.sin(x)
y1=np.cos(x)
plt.subplot(212)
plt.plot(x,y)
plt.subplot(211)
plt.plot(x,y1,color='red')
image.png
3、绘制图形:柱状图和堆叠柱状图(分类变量的频率分布)
柱状图
data=[5,25,50,20]
x=[0,1,2,3]
plt.bar(x,data)
#实际上表示传入数组对的值,表示在图像上也就是横纵坐标
也可以用range()写成:
data=[5,25,50,20]
plt.bar(range(len(data)),data)
输出结果:
image.png
水平柱状图:组数过多,或者组的名字过长,可以把横坐标放到纵轴
data=[5,25,50,20]
x=[0,1,2,3]
plt.barh(x,data)
也可以写成:
data = [5,25,50,20]
plt.barh(range(len(data)),data)
输出结果:
image.png
堆积柱状图:思路是横坐标偏移
data = [[5,25,50,20],
[4,23,51,17],
[6,22,52,19]]
x=np.arange(4)
plt.bar(x,data[0],width=0.25,label='A')
plt.bar(x+0.25,data[1],width=0.25,label='B')
plt.bar(x+0.50,data[2],width=0.25,label='C')
plt.legend()
image.png
垂直堆积柱状图:思路是引入bottom参数
data = [[5,25,50,20],
[4,23,51,17],
[6,22,52,19]]
x = np.arange(4)
plt.bar(x, data[0], width = 0.25, label='A')
plt.bar(x, data[1], width = 0.25, label='B',bottom = data[0])
plt.bar(x, data[2], width = 0.25, label='C',bottom = np.array(data[0]) + np.array(data[1]))
#列表不可以直接相加,但是np.array()可以。
plt.legend()
输出结果:
image.png
4、散点图
x=np.random.rand(50)
y=np.random.rand(50)
colors=np.random.randn(50)
area=np.pi*(15*np.random.rand(50))**2
plt.scatter(x,y,c=colors,alpha=0.5,s=area)
#alpha:透明度,[0,1],0完全透明,1完全不透明
#s:散点大小
#c:colors,可以用数值表示,此处表示随机
运行结果:
image.png
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.randint(0,2,size =50)
#相当于用颜色将所有点随机分成两类
area = np.pi * (15 * np.random.rand(N))**2
plt.scatter(x, y, c=colors, alpha=0.5,s = area)
运行结果:
image.png
5.条形图:连续变量的概率分布
在构建直方图之前,我们需要先定义好bin(分组/分箱数),也就是说我们需要先把连续值划分成不同等份,然后计算每一份里面数据的数量。
a = np.random.rand(100)
plt.hist(a,bins= 20) #a等分为20分
plt.ylim(0,15) #限制Y轴高度为0到15
运行结果:
image.png
a = np.random.randn(10000)
plt.hist(a,bins=50)
plt.title("标准正态度分布")
标题乱码的解决:
plt.rcParams['font.sans-serif']=['SimHei']
轴正负号无法显示的解决:
plt.rcParams['axes.unicode_minus']=False
运行结果:
image.png
6.盒图/箱线图
x = np.random.randint(20,100,size = (30,3))
plt.boxplot(x)
plt.ylim(0,120)
plt.xticks([1,2,3],['A','B','C'])
# 在x轴的什么位置填一个 label,我们这里制定在 1,2,3 位置,写上 A,B,C
#设置x轴刻度值的表现形式。如果要设置Y轴,则为plt.yticks()
plt.hlines(y = np.median(x,axis = 0)[0] ,xmin =0,xmax=3)
#沿着水平轴画一条线,如果是沿着纵轴则是plt.vlines()
输出结果:
image.png image.png image.png image.png
6.给图像增加文字
data = [[5,25,50,20],
[4,23,51,17],
[6,22,52,19]]
x=np.arange(4)
plt.figure(figsize=(20,5)) #表示figure 的大小为宽、长(单位为inch)
plt.tick_params(labelsize=15) #坐标轴的label大小为15
x_sub=[0.0,0.25,0.5]
plt.bar(x,data[0],width=0.25,label='A')
plt.bar(x+x_sub[1],data[1],width=0.25,label='B')
plt.bar(x+x_sub[2],data[2],width=0.25,label='C')
for i in range(3):
for a,b in zip(x+x_sub[i],data[i]):
plt.text(a,b,f'{b}',ha='center',va='bottom',fontsize=13)
#ha='center'表示居中,va= 'bottom'表示底部对齐,fontsize表示文字大小
#给坐标轴添加标签
plt.xlabel('组别',fontsize=15)
plt.ylabel('频数',fontsize=15)
输出结果:
image.png
7、用plt.annotate进行注释
在数据可视化的过程中,图片中的文字经常被用来注释图中的一些特征。使用annotate()方法可以很方便地添加此类注释。在使用annotate时,要考虑两个地方的坐标(text只需要一个):被注释的地方xy(x, y)和插入文本的地方xytext(x, y)
X=np.linspace(0,2*np.pi,100)
Y=np.sin(X)
Y_1=np.cos(X)
plt.plot(X,Y)
plt.plot(X,Y_1)
plt.annotate('SIN CURVE',
xy=(2,np.sin(2)), #标记坐标
xytext=(4,0.75), #文本坐标
arrowprops=dict(arrowstyle='->'), #连接符,可以用代码'?plt.annotate'查看
fontsize=15)
输出结果:
image.png
8、在一个画板中绘制多个图形
使用matplotlib制作直方图
首先,学习画不同类型的直方图。
(1)先从参数着手
plt.hist(
x,
bins=None, #分箱数,柱子的数量,切分为几组数据。如果横坐标落在箱子中,则频数+1.
range=None,
density=None, #样本的数量差异较大时,需y轴显示该组数据在样本中的百分比比较好
weights=None,
cumulative=False,
bottom=None,
histtype='bar', #直方图类型,默认为bar,还有{ ‘barstacked’, ‘step’, ‘stepfilled’}
align='mid',
orientation='vertical',
rwidth=None,
log=False,
color=None, #直方图的颜色
label=None, #直方图的标签
stacked=False, #是否创建堆积直方图,{False ,True}
normed=None, #是否进行归一化处理,{False ,1 , True},
data=None,
**kwargs,
)
**未注释的参数暂不记忆**
(2)归一化处理
在命令里加上参数normed=True后,直方图也可以被归一化以显示“相对”频率。
此时,y轴就变成了相对频率(频率=频次/样本总数;相对频率=频率/组距)。
(3)设置画板
#第一步:设置画板的图像大小和排列形状
plt.figure(figsize=(20,10))
fig,axes=plt.subplots(nrows=2,ncols=2)
#fig,axes是两个通用写法。fig是可以对整个画板再进行配置,axes得到的是子画板的信息
#第二步:拆分子画布
ax0,ax1,ax2,ax3=axes.flatten()
#把四个子画板拆分,然后才能添加元素和内容
#第三步:填充画布
#图一:画密度直方图 (参数:normed=1)
n_bins = 10 #拆分为10组,先赋值
x = np.random.randn(1000, 3) #正态分布数据,1000*3
colors = ['red', 'tan', 'lime']
ax0.hist(x, n_bins, normed=1, histtype='bar', color=colors, label=colors)
ax0.set_title('bars with legend')
ax0.legend(fontsize=10)
#图二:画堆叠的密度直方图(参数:normed=1,stacked=True)
ax1.hist(x, n_bins, normed=1, histtype='bar', stacked=True)
ax1.set_title('stacked bar')
#图三:画只有轮廓的堆叠直方图(histtype='step',fill=False)
ax2.hist(x, n_bins, histtype='step', stacked=True, fill=False)
ax2.set_title('stack step (unfilled)')
#图四:画不同长度数据集的多重直方图
#Make a multiple-histogram of data-sets with different length
x_multi = [np.random.randn(n) for n in [10000, 5000, 2000]]
ax3.hist(x_multi, n_bins, histtype='bar')
ax3.set_title('different sample sizes')
运行结果:
image.png
网友评论