文章目录
- 前言
- 一、Matplotlib基础
- (一)plt.show()函数
- (二)plt.plot()函数
- 二、电影数据绘图
- (一)绘制柱状图
- (二)绘制曲线图
- (三)绘制饼图
- (四)绘制直方图
- (五)绘制双轴图
- (六)绘制散点图
- (七)绘制箱线图
- (八)绘制矩阵图——热力图
前言
Matplotlib是Python中的一个2D图形包,pyplot里面有很多画图的函数,matplotlib.pyplot包含一系列类似MATLAB中绘制图的函数的相关函数,一般用plt作为matplotlib.pyplot的简写。
一、Matplotlib基础
导包:
import matplotlib.pyplot as plt#画图的包
import numpy as np
(一)plt.show()函数
在默认的情况在,matplotlib.pyplot是不会直接显示图像,只能用plt.show()函数才能把图像显示出来。
plt.show()函数默认在新的窗口打开一副图像,并且提供了对图像进行操作的按钮,但是在ipython命令中,我们可以将它插入notebook,就可以不调用plt.show()函数就会显示:
- %matplotlib notebook
- %matplotlib inline
(二)plt.plot()函数
用plt.plot()函数可以绘制简单的线图
plt.plot([1,2,3,4])#默认情况下[1,2,3,4]表示y 的
plt.show()
结果如下:
我们可以对轴上做一些设定:
plt.plot([1,2,3,4])#默认情况下[1,2,3,4]表示y 的
plt.ylabel('y')#y轴的标签
plt.xlabel('x')#x轴的标签
plt.show()
结果如下:
plot函数基本的用法:指定x、y
- plot(x,y),如果要指定x、y,顺序是先x后y,
如果不指定x,x就是y的索引,默认的是0~N-1
- plot(y)
字符参数
我们可以用字符来指定图形的格式
- 表示颜色的字符参数有:
字符 | 颜色 |
‘b’ | 蓝色,blue |
‘g’ | 绿色,green |
‘r’ | 红色,red |
‘c’ | 青色,cyan |
‘m’ | 品红,magenta |
‘y’ | 黄色,yellow |
‘k’ | 黑色,black |
‘w’ | 白色,white |
- 表示类型的字符参数有
字符 | 类型 | 字符 | 类型 |
‘-’ | 实线 | ’–‘ | 虚线 |
’-.‘ | 虚点线 | ‘:’ | 点线 |
‘.’ | 点 | ‘,’ | 像素点 |
‘o’ | 圆点 | ’_’ | 横线点 |
’^‘ | 上三角点 | ‘<’ | 左三角点 |
‘>’ | 右三角点 | ‘1’ | 下三叉点 |
‘2’ | 上三叉点 | ’3‘ | 左三叉点 |
’4‘ | 右三叉点 | ‘s’ | 正方点 |
‘p’ | 五角点 | ‘*’ | 星形点 |
‘h’ | 六边形点1 | ’H’ | 六边形2 |
’+‘ | 加号点 | ‘x’ | 乘号点 |
‘D’ | 实心菱形点 | ‘d’ | 瘦菱形点 |
如画一个红色额的圆点:
plt.plot([1,3,5,6],[1,9,25,36],'ro')
plt.show()
结果如下:
显示范围
我们可以调整图形的显示范围,这个和MATLAB类似,可以用axis函数指定坐标轴的显示范围:
plt.axis([xmin,xmax,ymin,ymax])
plt.plot([1,3,5,6],[1,9,25,36],'gh')
plt.axis([0,8,0,40])
plt.show()
结果如下:
传入Numpy数组
之前画的图都是列表,但是现实分析数据的时候更加常见的是numpy数组。事实上,如果我们传入的是列表,matplotlib会在内部将它转化成数组再进行处理。
在图里面画多个线条
t = np.arange(0.,5.,0.2)
plt.plot(t,t,'g--',
t,t**2,'bs',
t,t**3,'g^')#可分行,可不分
结果如下:
线条属性
我们可以通过关键词来改变线条的性质,例如linewidth可以改变线条的宽度,color可以改变线条的颜色:
x = np.linspace(-np.pi,np.pi)#从-3.14到3.14
y = np.sin(x)
plt.plot(x,y,linewidth=5.0,color='#1685a9')
plt.show()
结果如下:
这个调整和上面的字符差不多。
使用plt.plot()的返回值来设置线条属性
除了上面的方法,我们还可以根据plt.plot()的返回值来设置线条属性。
plot函数返回的是一个Line2D对象组成的列表,每一个对象代表输入的一对组合,如:
- line1.line2为两个Line2D对象
line1.line2 = plt.plot(x1,y1,x2,y2) - 返回3个Line2D对象组成的列表
lines = plt.plot(x1,y1,x2,y2,x3,y3)
我们可以使用这个返回值对线条属性进行设置:
line1,line2 = plt.plot(x,y,'r-',x,y+1,'g-')#红色是line1,绿色是line2,单数无法对列表进行操作
line1.set_antialiased(False)
plt.show()
结果如下:
对line1进行操作后就不像绿色的曲线光滑。
plt.setp()修改线条性质
这是一个更加简便的方法
line = plt.plot(x,y)
plt.setp(line,color='g',linewidth=5)
结果如下:
子图
figure()函数会产生一个指定编号为num的图:
plt.figure(num)
这里的figure(1)是可以省略的,因为默认状态下plt就是产生一幅图
使用subplot能在一幅图画多个子图,其中的参数:
plt.subplot(numrows,numcols,fignum)
其中当numrows*numcols<10,中间的逗号可以省去,plt.subplot(211)就表示plt.subplot(2,1,1)
def f(t):
return np.exp(-t)*np.cos(2*np.pi*t)#设定函数
t1 = np.arange(0.0,5.0,0.1)
t2 = np.arange(0.0,5.0,0.02)
plt.figure(figsize=(10,6))#设置图形大小
plt.subplot(211)
plt.plot(t1,f(t1),'bo',t2,f(t2),'k')#子图1
plt.subplot(212)
plt.plot(t2,np.cos(2*np.pi*t2),'r--')#子图2
结果如下:
二、电影数据绘图
导入需要用的库
import warnings
warnings.filterwarnings('ignore')#对一些警告进行忽略
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 用黑体显示中文
plt.rcParams['axes.unicode_minus']=False#负号正常显示
(一)绘制柱状图
柱状图(bar chart)是一个长方形的长度为变量的表达图形的统计图,由一系列高低不等的纵向条形表示数据的分布情况,用来比较两个或两个以上的价值(不同时间或不同条件),当只有一个变量时,通常用于较小的数据集分布,柱状图可横向排列。
data = w['产地'].value_counts()
data
#定义x和y
x = data.index
y = data.values
plt.figure(figsize=(10,6))#定义图的大小
plt.bar(x,y,color='g')#画柱状图
plt.title('各国家或地区电影数据',fontsize=20)#设置图的标题,fontsize=20字体的大小
plt.xlabel('国家或地区',fontsize=16)#设置x轴标签
plt.ylabel('电影数量',fontsize=16)#设置y轴标签
plt.tick_params(labelsize=14)#调轴上字体大小
plt.xticks(rotation=90)#对x轴上的字进行90度旋转
for a,b in zip(x,y):
plt.text(a,b+10,b,ha='center',va='bottom',fontsize=10)#a表示x轴的位置,b+10是y轴的位置,b表示数据,ha='center'表示居中,va='bottom'在柱子上
pit.show()
结果如下:
plt.grid()表示的是在图上加网格线。
(二)绘制曲线图
曲线图又称为折线图,这是利用曲线的升降变化来表示研究对象的变化趋势的一种图形。它主要用于分析经济现象的发展变化、依存关系等方面。
data = w['年代'].value_counts()
data = data.sort_index()[:-1]#排序把最后一行删去
x = data.index
y = data.values
plt.plot(x,y,color='b')
plt.title('每年电影数量',fontsize=20)#设置图的标题,fontsize=20字体的大小
plt.xlabel('年份',fontsize=16)#设置x轴标签
plt.ylabel('电影数量',fontsize=16)#设置y轴标签
for a,b in zip(x[::10],y[::10]):
plt.text(a,b+10,b,ha='center',va='bottom',fontsize=10)
plt.annotate('2012到达最大值',xy=(2012,data[2012]),xytext=(2025,2100),arrowprops=dict(facecolor='black',edgecolor='red'))
#plt.annotate表示最大值的地方,xy=(2012,data[2012]箭头位置,xytext=(2025,2100)文本框放的位置,arrowprops箭头设置
plt.text(1980,1000,'电影数量开始快速增长')
plt.show()
结果如下:
总结:
- xlabel : x轴标注
- ylabei : y轴标注
- title : 图形标题
- text : 在指定位置放文字
- annotate : 和text差不多,有两个参数,xy:注释位置,xytext:注释文字位置
(三)绘制饼图
适合类别比较小的。
函数原型:
pie(x,explode=None,labels=None,colors=None,autopct=None,pctdistance=0.6,shadow=False,labeldistance=1.1,startangle=None,radius=None)
参数解释:
- x——
- labels——饼图外侧显示的说明文字
- explode——每一块离中心的距离
- startangle——起始绘制角度,默认是从x轴方向逆时针画起,若设置=90咋就说从y轴正方向画起
- shadow——是否有阴影
- labeldistance——labei绘制的位置,相对于半径的比例,如<1则绘制在饼图内侧
- autopct——控制饼图内百分比设置,可以使用format字符串或者format function %1.1f指的是小数点前后位数(没有用空格补齐)
- pctdistance——类似于labeldistance,指定autopct的位置刻度
- radius——控制圆的半径
例子:
data = pd.cut(w['时长'],[0,60.90.110,1000]).value_counts()#离散化+统计
y = data.values
y = y/sum(y)#归一化处理
plt.figure(figsize=(7,7))
plt.title('电影时长占比',fontsize=15)
plt.pie(y,labels=data.index,autopct='%.1f%%',color='bygr',startangle=90)
plt.legend()#图例
plt.show()
结果如下:
我还可以通过函数的返回值来设定字体:
patches,l_text,p_text = plt.pie(y,labels=data.index,autopct='%.1f%%',color='bygr',startangle=90)
for i in p_text:
i.set_size(15)
i.set_color('w')#饼图内部的字体
for i in l_text:
i.set_size(15)
i.set_color('r')#饼图外部的字体
(四)绘制直方图
直方图(Histogram)又称质量分布图。是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。
直方图是数值数据分布的精确图形表示。这是一个连续变量(定量变量)的概率分布的估计,并且被卡尔·皮尔逊(Kar Pearson)首先引入。
hist的参数非常多,但常用的就这六个,只有第一个是必须的,后面可选
- arr:需要计算直方图的一维数组
- bins:直方图的柱数,可选项,默认为10
- normed:是否将得到的直方图向量归一化。默认为0
- facecolor:直方图颜色
- edgecolor:直方图边框颜色
- alpha:透明度
- histtype:直方图类型,‘bar’ , ‘barstacked’ , ‘step’ , ‘stepfilled’
返回值:
- n:直方图向量,是否归一化由参数normed设定
- bins:返回各个bin的区间范围
- patches:返回每个bin里面包含的数据,是一个list.
plt.figure(figsize=(10,6))
plt.hist(w['评分'],bins=20,edgecolor='k',alpha=0.5)
plt.show()
结果如下:
可以根据前面的方法来设置标题这些。
(五)绘制双轴图
根据(四)绘制的直方图的基础上绘制双轴图
import matplotlib.mlab as mlab#
from scipy import stats
fig = plt.figure(figsize=(10,8))
ax1 = fig.add_subplot(111)
n,bins,patches = ax1.hist(w['评分'],bins=100,color='m')
ax1.set_ylabel('电影数量',fontsize=15)
ax1.set_xlabel('评分',fontsize=15)
ax1.set_title('频率分布图',fontsize=20)
y = stats.norm.pdf(bins,w['评分'].mean(),w['评分'].std())
ax2 = ax1.twinx()
ax2.plot(bins,y,'b--')
ax2.set_ylabel('概率分布',fontsize=15)
plt.show()
结果如下:
(六)绘制散点图
散点图主要是看两变量之间是否有关联。
x = w['时长'][::100]#[::100]表示是每个100取一个数
y = w['评分'][::100]
plt.figure(figsize=(10,6))
plt.scatter(x,y)#可以进行设置marker可以设置点的形状
plt.legend()
plt.title('电影时长与评分散点图',fontsize=20)
plt.xlabel('时长',fontsize=18)#设置x轴标签
plt.ylabel('评分',fontsize=18)#设置y轴标签
plt.show()
结果如下:
(七)绘制箱线图
箱形图(Box-plot )又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理。它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比较。箱线图的绘制方法是:先找出一组数据的中位数、两个四分位数、上下边缘线;然后,连接两个四分位数画出箱子;再将上下边缘线与箱子相连接,中位数在箱子中间。
箱线图大致形状:
一般的步骤:
(1)计算上四分位数(Q3 ),中位数,下四分位数(Q1)
( 2)计算上四分位数和下四分位数之间的差值,即四分位数( lQR,interquartile range ) Q3-Q1
( 3 )绘制箱线图的上下范围,上限为上四分位数,下限为下四分位数。在箱子内部中位数的位置绘制横线
( 4 )大于上四分位数1.5倍四分位数差的值,或者小于下四分位数1.5倍四分位数差的值,划为异常值( outliers )( 5)异常值之外,最靠近上边缘和下边缘的两个值处,画横线,作为箱线图的触须
(6)极端异常值,即超出四分位数差3倍距离的异常值,用实心点表示;较为温和的异常值,即处于1.5倍-3倍四分位数差之间的异常值,用空心点表示(7 )为箱线图添加名称,数轴等
参数:
plt.boxplot(x,notch=None, sym=None, vert=None,whis=None, positinotallow=None,widths=None,
patch_artist=None, meanline=None,showmeans=None,showcaps=None, showbox=None, showfliers=Nnotallow=None, labels=None.flierprops=None.medianprops=None, meanprops=None.
capprops=None, whiskerprops=None)
其中:
×∶指定要绘制箱线图的数据;
notch :是否是凹口的形式展现箱线图,默认非凹口;
sym :指定异常点的形状,默认为+号显示;
vert:是否需要将箱线图垂直摆放,默认垂直摆放;
whis :指定上下须与上下四分位的距离,默认为1.5倍的四分位差;
positions :指定箱线图的位置,默认为[0,1,2…];
widths :指定箱线图的宽度,默认为0.5;
patch_artist :是否填充箱体的颜色;
meanline :是否用线的形式表示均值,默认用点来表示;
showfliers :是否显示异常值,默认显示;
boxprops :设置箱体的属性,如边框色,填充色等;
labels :为箱线图添加标签,类似于图例的作用;
flierprops :设置异常值的同性,如异常点的形状、大小、填充色等;
medianprops :设置中位数的属性,如线的类型、粗细等;
meanprops :设置均值的属性,如点的大小、颜色等;
capprops :设置箱线图顶端和末端线条的属性,如颜色、粗细等;
whiskerprops :设置须的属性,如颜色、粗细、线的类型等
data = w[w.产地=='美国']['评分']
plt.figure(figsize=(10,6))
plt.boxplot(data,whis=2,flierprops={'marker':'*','markerfacecolor':'r','color':'k'},
patch_artist=True,boxprops={'color':'k','facecolor':'#9999ff'})
plt.title('美国电影评分',fontsize=20)
plt.show()
结果如下:
多组数据箱线图
data1 = w[w.产地=='中国大陆']['评分']
data2 = w[w.产地=='日本']['评分']
data3 = w[w.产地=='中国香港']['评分']
data4 = w[w.产地=='英国']['评分']
data5 = w[w.产地=='法国']['评分']
plt.figure(figsize=(12,8))
plt.boxplot([data1,data2,data3,data4,data5],labels=['中国大陆','日本','中国香港','英国','法国'],
whis=2,flierprops={'marker':'*','markerfacecolor':'#44cef6','color':'#003472'},
patch_artist=True,boxprops={'color':'#a1afc9','facecolor':'#a1afc9'})
ax = plt.gca()#获得当前坐标系
ax.patch.set_facecolor('#f0f0f4')#坐标系颜色
ax.patch.set_alpha(0.3)#透明度
plt.title('电影评分箱线图',fontsize=20)
plt.show()
结果如下:
vert=False#箱线图是一个横向的。
(八)绘制矩阵图——热力图
矩阵图:
data = w[['投票人数','评分','时长']]
data[:5]
%pylab inline
result = pd.plotting.scatter_matrix(data[::100],diagonal='kde',color='k',alpha=0.3,figsize=(10,10))
可以用seaborn,可以理解pandas的DataFrame类型
(1)热力图输入数据参数:
data:矩阵数据集,可以是numpy的数组(array),也可以是pandas的DataFrame。如果是DataFrame,则df的index/column信息会分别对应到heatmap的columns和rows,即df.index是热力图的行标,df.columns是热力图的列标
(2)热力图矩阵块颜色参数:
vmax,vmin:分别是热力图的颜色取值最大和最小范围,默认是根据data数据表里的取值确定
cmap:从数字到色彩空间的映射,取值是matplotlib包里的colormap名称或颜色对象,或者表示颜色的列表;改参数默认值:根据center参数设定
center:数据表取值有差异时,设置热力图的色彩中心对齐值;通过设置center值,可以调整生成的图像颜色的整体深浅;设置center数据时,如果有数据溢出,则手动设置的vmax、vmin会自动改变
robust:默认取值False;如果是False,且没设定vmin和vmax的值,热力图的颜色映射范围根据具有鲁棒性的分位数设定,而不是用极值设定
(3)热力图矩阵块注释参数:
annot(annotate的缩写):默认取值False;如果是True,在热力图每个方格写入数据;如果是矩阵,在热力图每个方格写入该矩阵对应位置数据
fmt:字符串格式代码,矩阵上标识数字的数据格式,比如保留小数点后几位数字
annot_kws:默认取值False;如果是True,设置热力图矩阵上数字的大小颜色字体,matplotlib包text类下的字体设置;官方文档:
(4)热力图矩阵块之间间隔及间隔线参数:
linewidths:定义热力图里“表示两两特征关系的矩阵小块”之间的间隔大小
linecolor:切分热力图上每个矩阵小块的线的颜色,默认值是’white’
(5)热力图颜色刻度条参数:
cbar:是否在热力图侧边绘制颜色刻度条,默认值是True
cbar_kws:热力图侧边绘制颜色刻度条时,相关字体设置,默认值是None
cbar_ax:热力图侧边绘制颜色刻度条时,刻度条位置设置,默认值是None
(6)square:设置热力图矩阵小块形状,默认值是False
xticklabels, yticklabels:xticklabels控制每列标签名的输出;yticklabels控制每行标签名的输出。默认值是auto。如果是True,则以DataFrame的列名作为标签名。如果是False,则不添加行标签名。如果是列表,则标签名改为列表中给的内容。如果是整数K,则在图上每隔K个标签进行一次标注。 如果是auto,则自动选择标签的标注间距,将标签名不重叠的部分(或全部)输出
mask:控制某个矩阵块是否显示出来。默认值是None。如果是布尔型的DataFrame,则将DataFrame里True的位置用白色覆盖掉
ax:设置作图的坐标轴,一般画多个子图时需要修改不同的子图的该值
热力图:
import seaborn as sns
corr = data.corr()
corr = abs(corr)
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(figsize=(10,8))
ax = sns.heatmap(corr,vmax=1,vmin=0,annot=True,annot_kws={'size':13,'weight':'bold'},linewidths=0.05)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.show()
结果如下: