matplotlib是一个python的2D图形包。pyplot封装了很多画图的函数。
导入相关的包:
import matplotlib.pyplot as plt
import numpy as np
matplotlib. pyplot包含一系列类似 MATLAB中绘图函数的相关函数。每个matplotlib. pyplot中的函数对当前的图像进行一些修改 ,例如:产生新的图像,在图像中产生新的绘图区域,在绘图区域中画线,给绘图加上标记,等等… matplotlib. pyplot会自动记住当前的图像和绘图区域,因此这些函数会直接作用在当前的图像上。
在实际的使用过程中,常常以plt作为matplotlib. pyplot的省略。
默认情况下, matplotlib. pyplot不会直接显示图像,只有调用plt.show()函数时,图像才会显示出来。
plt. show()默认是在新窗口打开一幅图像,并且提供了对图像进行操作的按钮。
不过在ipython命令行中,我们可以将它插入notebook中,并且不需要调用plt. show()也可以显示:
●%matplotlib notebook
●%matplotlib inline
不过在实际写程序中,我们还是习惯调用plt. show()函数将图像显示出来。
plot函数基本的用法:
指定x和y
plt.plot()函数可以用来绘线型图:
plt.plot ([1,2,3,4]) ## 若只有一个列表,默认为y轴数据,x轴数据为列表的索引
plt.show() #因为未使用%matplotlib notebook或者%matplotlib inline 所以要plt.show()
plt.plot ([1,2,3,4],[4,5,6,7])
plt.show()
—————————————————————————————
这里使用**%matplotlib notebook** ,后续即不需要plt.show()
%matplotlib notebook
给x,y轴命名
plt.plot ([1,2,3,4],[4,5,6,7])
plt.ylabel('y')
plt.xlabel('x')
常见颜色
标识 | 描述 |
---|---|
r | 红色 |
g | 绿色 |
b | 蓝色 |
w | 白色 |
c | 青色 |
m | 洋红 |
y | 黄色 |
k | 黑色 |
常见线类型
标识 | 描述 |
---|---|
- | 实线 |
– | 虚线 |
-. | 点划线 |
: | 点虚线 |
‘’ | 空格 |
常见标记
标识 | 描述 |
---|---|
‘.’ | point marker |
‘,’ | pixel marker |
‘o’ | circle marker |
‘v’ | triangle_down marker |
‘^’ | triangle_up marker |
‘<’ | triangle_left marker |
‘>’ | triangle_right marker |
‘1’ | tri_down marker |
‘2’ | tri_up marker |
‘3’ | tri_left marker |
‘4’ | tri_right marker |
‘s’ | square marker |
‘p’ | pentagon marker |
‘*’ | star marker |
‘h’ | hexagon1 marker |
‘H’ | hexagon2 marker |
‘+’ | plus marker |
‘x’ | x marker |
‘D’ | diamond marker |
‘d’ | thin_diamond marker |
‘|’ | vline marker |
‘_’ | hline marker |
显示图例位置
位置的字符串 | 位置的标识 |
---|---|
best | 0 |
upper right | 1 |
upper left | 2 |
lower left | 3 |
lower right | 4 |
right | 5 |
center left | 6 |
center right | 7 |
lower center | 8 |
upper center | 9 |
center | 10 |
画出红色圆点
plt.plot ([1,2,3,4],[4,5,6,7],'ro')
可以看出,有两个点在图像的边缘,因此,我们需要改变轴的显示范围。
与MATLAB类似,这里可以使用axis函数指定坐标轴显示的范围:
plt. axis([xmin,xmax, ymin, ymax])
plt.plot ([1,2,3,4],[4,5,6,7],'ro')
plt.axis([0,6,2,8])
plt.show()
之前我们传给plot的参数都是列表,事实上,向plot中传入numpy数组是更常用的做法。
事实上,如果传入的是列表, matplotlib会在内部将它转化成数组再进行处理:
在一个图里画多条线
t=np.arange(0.,5.,0.2)
plt.plot(t,t,'r--', ## 分行是为了看的更清楚,不分行也行
t,t**2,'bs',
t,t**3,'g^')
plt.show()
事实上,在上面的例子中,我们不仅仅向plot函数传入了数组,还传入了多组(x, y, format_ str) 参数,它们在同一-张图上显示。这意味着我们不需要使用多个plot函数来画多组数组,只需要可以将这些组合放到一个plot函数中去即可。
之前提到,我们可以用字符串来控制线条的属性,事实上还可以通过关键词来改变线条的性质,例如linwidth可以改变线条的宽度, color可以改变线条的颜色:
x=np.linspace(-np.pi,np.pi)
y=np.sin(x)
plt.plot(x,y)
plt.show()
x=np.linspace(-np.pi,np.pi)
y=np.sin(x)
plt.plot(x,y,linewidth=4.0) ## 设置宽度
plt.show()
x=np.linspace(-np.pi,np.pi)
y=np.sin(x)
plt.plot(x,y,linewidth=4.0,color='r') ## 设置颜色
plt.show()
plot函数返回一个Line2D对象组成的列表,每个对象代表输入的一对组合,例如:
line1, line2为两个Line2D对象
linel, 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')
plt.show()
line1,line2=plt.plot(x,y,'r',x,y+1,'g')
line1.set_antialiased(False) ## 把line1的抗锯齿关了,即让line1不那么平滑
plt.show()
对于用一个line收集成为列表,有些功能是用不了的,上面例子中的抗锯齿就关不了,会报错
更方便的做法是使用plt的setp函数:
line=plt.plot(x,y)
plt.setp(line,color='r',linewidth=4) ## 或者plt.setp(line,'color','r','linewidth',4)
plt.show()
figure ()函数会产生一个指定编号为num的图:
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
num:图像编号或名称,数字为编号 ,字符串为名称
figsize:指定figure的宽和高,单位为英寸;
dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80,1英寸等于2.5cm,A4纸是 21*30cm的纸张
facecolor:背景颜色
edgecolor:边框颜色
frameon:是否显示边框
这里, figure(1)其实是可以省略的,因为默认情况下plt会自动产生一幅图像。
其中numrows, numcols是行列数, fignum是第几个图,比如(221)则是一个有四个图,该图位于第一个
当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.,5.,0.1)
t2 = np.arange(0.,5.,0.02)
plt.figure(figsize=(10,6)) ## 设置图的大小
plt.subplot(211) ## 选取第一个图
plt.plot(t1,f(t1),'bo',t2,f(t2),'k')
plt.subplot(212) ## 选取第二个图
plt.plot(t1,np.cos(t1),'r--')
plt.show()
电影数据 提取码:jwlf
数据链接在前面文章pandas里面
在了解了绘图的基础知识之后,我们可以对电影数据进行可视化分析。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] ## 防止图中汉字乱码
plt.rcParams['axes.unicode_minus']=False ## 防止负号乱码
df=pd.read_excel('movie_data2.xlsx')
df.head()
柱状图(bar chart) ,是一种以长方形的长度为变 量的表达图形的统计报告图,由一系列高度不等的纵向条纹表示数据分布的情况,用来比较两个或以上的价值(不
同时间或者不同条件) , 只有一个变量,通常利用于较小的数据集分析。柱状图亦可横向排列,或用多维方式表达。
data = df.产地.value_counts()
data
x=data.index
y=data.values
plt.figure(figsize=(10,6))
plt.bar(x,y,color='g') ## 柱状图函数为bar
plt.title('各国家或地区电影数量',fontsize=20)
plt.xlabel('国家或地区',fontsize=18)
plt.ylabel('电影数量',fontsize=18)
plt.xticks(rotation=90) ## 使x轴坐标旋转90度
for a,b in zip(x,y): ## 给每一个柱型顶部加上数据
plt.text(a,b+10,b,ha='center',fontsize=10)
"""
plt.text()作用:画图时给图中的点 加标签
语法格式
**plt.text(x, y, s, fontsize, verticalalignment,horizontalalignment,rotation , kwargs)
其中
(1)x,y:标签添加的位置,注释文本内容所在位置的横/纵坐标,默认是根据坐标轴的数据来度量的,是绝对值,也就是说图中点所在位置的对应的值,特别的,如果你要变换坐标系的话,要用到transform=ax.transAxes参数。
(2)s:标签的符号,字符串格式,比如你想加个“我爱python”,更多的是你标注跟数据有关的主体。
(3)fontsize:加标签字体大小,取整数。
(4)verticalalignment:垂直对齐方式 ,可选 ‘center’ ,‘top’ , ‘bottom’,‘baseline’ 等
(5)horizontalalignment:水平对齐方式 ,可以填 ‘center’ , ‘right’ ,‘left’ 等
(6)rotation:标签的旋转角度,以逆时针计算,取整
(7)family :设置字体
(8)style: 设置字体的风格
(9)weight:设置字体的粗细
(10) bbox:给字体添加框, 如 bbox=dict(facecolor=‘red’, alpha=0.5) 等。
(11)string:注释文本内容
(12)color:注释文本内容的字体颜色
"""
plt.grid() ## 添加网格线
plt.show()
曲线图又称折线图,是利用曲线的升、降变化来表示被研究现象发展变化趋势的一种图形。它在分析研究社会经济现象的发展变化、依存关系等方面具有重要作用。
绘制曲线图时,如果是某一现象的时间指标,应将时间绘在坐标的横轴 上指标绘在坐标的纵轴上。如果是两个现象依存关系的显示,可以将表示原因的指标绘在横轴上,表示结果的指标绘在纵轴上。同时还应注意整个图形的长宽比例。
1888-2015年
data=df['年代'].value_counts().sort_index()
data=data[data.index<2016] ## 去掉2016年之后的
data
x=data.index
y=data.values
plt.plot(x,y,color='b')
plt.title('每年电影数量',fontsize=20)
plt.ylabel('电影数量',fontsize=18)
plt.xlabel('年份',fontsize=18)
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.text(1980,1000,'电影数量开始快速增长')
plt.show()
详解标注点函数annotate()
对于这幅图形,我们使用xlabel , ylabel , title , text方法设置了文字,其中:
●xlabel : x轴标注
●ylabel : y轴标注
●title :图形标题
●text :在指定位置放入文字
输入特殊符号支持使用Text语法,用 < s o m e T e x c o d e >
除了使用text在指定位置标上文字之外,还可以使用annotate函数进行注释。
饼图英文学名为Sector Graph,有名Pie Graph。常用于统计学模块。2D饼图为圆形,手画时,常用圆规作图。
仅排列在工作表的一-列或- 行中的数据可以绘制到饼图中。饼图显示一个数据系列( 数据系列:在图表中绘制的相关数据点,这些数据源自数据表的行或列。图表中的每个数据系列具有唯的颜色或图案并且在图表的图例中表示。 可以在图表中绘制一个或多个数据系列。 饼图只有一个数据系列。 ) 中各项的大小与各项总和的此例。讲图中的数据点(数据点:在图表中绘制的单个值.这些值由条形、柱形、折线、饼图或圆环图的扇面、圆点和其他被称为数据标记的图形表示,租同颜色的数据标记组成一个 数据系列。) 显示为整个饼图的百分比。
pie(x,explode=None, labels=None, colors=None, autopct=None, pctdistance=0. 6,shadow=False,labeldistance=1. 1,startangle=None, radius=None)
参数:
x (每一块)的比例,如果sum(x) > 1会使用sum(x)归一化
labels (每一块)饼图外侧显示的说明文字
explode (每一块)离开中心距离
startangle起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起
shadow是否阴影
labeldistance labe|绘制位置相对于半径的比例,如<1则绘制在饼图内侧
autopct控制饼图内百分比设置可以使用format字符串或者format function '%1.1f指小数点前后位数(没有用空格补齐)
pctdistance类似于labeldistance,指定autopct的位置刻度
radius控制饼图半径
返回值:
如果没有设置autopct,返回(patches, texts)
如果设置autopct,返回(patches, texts, autotexts)
data=pd.cut(df['时长'],[0,60,90,110,1000]).value_counts() ## 切分时长分组
data
y=data.values/sum(data.values) ## 是否算出比率都行,不算,函数自动归一化处理
plt.figure(figsize=(7,7))
plt.title('电影时长占比',fontsize=15)
plt.pie(y,labels=data.index,autopct='% .1f %%',colors='bygr',startangle=90)
plt.legend() ## 增加图例
plt.show()
带返回值的样子
直方图(Histogram)又称质量分布图。是一种统计报告图,由-系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型 ,纵轴表示分布情况。
直方图是数值数据分布的精确图形表示。这是一个连续变量 (定量变量)的概率分布的估计,并且被卡尔皮尔逊( Karl Pearson )首先引入。它是一种条形图。
为了构建直方图,第-步是将值的范围分段,即将整个值的范围分成一系列间隔 ,然后计算每个间隔中有多少值。这些值通常被指定为连续的,不重叠的变量间隔。间隔必须相邻,并且通常是(但不是必须的)相等的大小。
直方图也可以被归一化以显示”相对"频率。然后,它显示了属于几个类别中的每个案例的比例,其高度等于1.
hist的参数非常多,但常用的就这六个,只有第一个是必须的 ,后面可选
arr:需要计算直方图的一维数组
bins:直方图的柱数,可选项,默认为10
normed:是否将得到的直方图向量归一化。默认为0
facecolor:直方图颜色
edgecolor:方图边框颜色
alpha:透明度
histtype:直方图类型, ‘bar’, ‘barstacked’, ‘step’, ‘stepilled’
返回值:
n:直方图向量,是否归一化由参数normed设定。当normed取默认值时,n即为直方图各组内元素的数量(各组频数)
bins: 返回各个bin的区间范围
patches:返回每个bin里面包含的数据,是一个list
plt.figure(figsize=(10,6))
plt.hist(df.评分,bins=20,edgecolor='black',alpha=0.5)
plt.show()
fig=figure(figsize=(10,8)) # 创做一个为10x8的画布
ax1=fig.add_subplot(11) # 做1*1个子图
ax2 = ax1.twinx() # 让2个子图的x轴一样,同时创建副坐标轴。
# 作y=sin(x)函数
x1 = np.linspace(0, 2 * np.pi, 100) # 表示在区间[0, 2π]之间取100个点作为横坐标
y1 = np.sin(x1)
ax1.plot(x1, y1)
# 作y=cos(x)函数
x2 = np.linspace(0, 2 * np.pi, 100)
y2 = np.cos(x2)
ax2.plot(x2, y2)
plt.show()
用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。散点图将序列显示为-组点。值由点在图表中的位置表示。类别由图表中的不同标记表示。散点图通常用于比较跨类别的聚合数据。
x=df['时长']
y=df['评分']
plt.figure(figsize=(10,6))
plt.scatter(x,y,color='c',marker='p',label='评分')
plt.legend()
plt.title('电影时长与评分散点图',fontsize=20)
plt.xlabel('时长',fontsize=18)
plt.ylabel('评分',fontsize=18)
plt.show()
由于我们的数据量过大,所以画出来的图非常冗杂
可以发现,大部分的电影时长还是集中在100附近,评分大多在7分左右。
marker属性
设置散点的形状
Matplotlib 绘图标记
箱形图( Box-plot )又称为盒须图、盒式图或箱线图.是种用作显示-组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用.常见于品质管理。它主要用于反映原始数据分布的特征.还可以进行多组数据分布特征的比较。箱线图的绘制方法是:先找出- -组数据的中位数、两个四分位数、上下边缘线;然后,连接两个四分位数画出箱子;再将上下边缘线与箱子相连接,中位数在箱子中间。
一般计算过程
(1 )计算上四分位数(Q3) ,中位数,下四分位数(Q1 )
(2)计算上四分位数和下四分位数之间的差值,即四分位数差(IQR,interquartile range ) Q3-Q1
(3 )绘制箱线图的上下范围,上限为上四分位数。下限为下四分位数。在箱子内部中位数的位置绘制横线
(4)大于上四分位数1.5倍四分位数差的值,或者小于下四分位数1.5倍四分位数差的值,划为异常值( outiers )
(5)异常值之外,最靠近上边缘和下边缘的两个值处,画横线,作为箱线图的触须
(6 )极端异常值,即超出四分位数差3倍距离的异常值,用实心点表示;较为温和的异常值,即处于1.5倍3倍四分位数差之间的异常值,用空心点表示
(7 )为箱线图添加名称,数轴等
参数详解
plt.boxplot(x,notch=None, sym=None, vert =None,whis=None, positions=None, widths=None,patch_artist=None, meanline=None, showmeans=None,showcaps=None, showbox=None, showfliers=None,boxprops=None, labels=None, flierprops=None,medianprops=None, meanprops=None,capprops=None, whiskerprops=None)
x :指定要绘制箱线图的数据;
notch :是否是凹口的形式展现箱线图,默认非凹口;
sym :指定异常点的形状,默认为+号显示;
vert :是否需要将箱线图垂直摆放,默认垂直摆放;
whis :指定上下须与上下四分位的距离,默认为1.5倍的四分位差;
positions :指定箱线图的位置,默认为[0,1,2…];
widths :指定箱线图的宽度,默认为0.5 ;
patch_artist :是否填充箱体的颜色;
meanline :是否用线的形式表示均值,默认用点来表示;
data=df[df.产地=='美国'].评分
plt.figure(figsize=(10,6))
plt.boxplot(data,whis=2,flierprops={'marker':'o','markerfacecolor':'r','color':'k'},
patch_artist=True,boxprops={'color':'k','facecolor':'#9999ff'})
## 除了data,其他都为可选项,可以不写
plt.title('美国电影评分',fontsize=20)
plt.show()
data1=df[df.产地=='中国大陆'].评分
data2=df[df.产地=='日本'].评分
data3=df[df.产地=='中国香港'].评分
data4=df[df.产地=='英国'].评分
data5=df[df.产地=='法国'].评分
plt.figure(figsize=(12,8))
plt.boxplot([data1,data2,data3,data4,data5],labels=['中国','日本','中国香港','英国','法国'],whis=2,flierprops={'marker':'o', 'markerfacecolor':'r','color':'k'},
patch_artist=True,boxprops={'color':'k','facecolor':'#9999ff'})
plt.title('电影评分箱线图',fontsize=20)
plt.show()
设置坐标系颜色
data1=df[df.产地=='中国大陆'].评分
data2=df[df.产地=='日本'].评分
data3=df[df.产地=='中国香港'].评分
data4=df[df.产地=='英国'].评分
data5=df[df.产地=='法国'].评分
plt.figure(figsize=(12,8))
plt.boxplot([data1,data2,data3,data4,data5],labels=['中国','日本','中国香港','英国','法国'],whis=2,flierprops={'marker':'o', 'markerfacecolor':'r','color':'k'},
patch_artist=True,boxprops={'color':'k','facecolor':'#9999ff'})
plt.title('电影评分箱线图',fontsize=20)
ax=plt.gca() ## 获取坐标系
ax.patch.set_facecolor('gray') ## 将坐标系设为灰色
ax.patch.set_alpha(0.3) ## 设置透明度
plt.show()
plt.boxplot([data1,data2,data3,data4,data5],labels=['中国','日本','中国香港','英国','法国'],whis=2,flierprops={'marker':'o', 'markerfacecolor':'r','color':'k'},
patch_artist=True,boxprops={'color':'k','facecolor':'#9999ff'}
,vert=False) ## 添加vert,置为false
data=df[['投票人数','评分','时长']]
pandas本身也封装了画图函数
我们可以画出各个属性之间的散点图,对角线是分布图
data=df[['投票人数','评分','时长']]
%pylab inline
result=pd.plotting.scatter_matrix(data[::100],diagonal='hist',color='k',alpha=0.3,figsize=(7,7,))
现在我们来画电影时长,投票人数,评分的一个相关系数矩阵图
seaborn是一个精简的python库,可以创建具有统计意义的图表,能理解pandas的DataFrame类型。
import seaborn as sns
corr=abs(data.corr()) ## 获得相关系数
plt.figure(figsize=(10,8)) ## 设置画布大小
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()
参数详解
seaborn.heatmap(data, vmin=None, vmax=None,cmap=None, enter=None,robust=False, annot=None, fmt= '.2g, annotkws=None,linewidths=0,linecolor='white', cbar=True, cbar_kws=None,cbar_ax=None,square=False, xticklabels= auto', yticklabels= auto', mask=None, ax=None, **kwargs)
(1 )热力图输入数据参数:
data:矩阵数据集,可以是numpy的数组( array),也可以是pandas的DataFrame。 如果是DataFrame ,则df的index/column信息会分别对应到heatmap的columns和rows ,即pt.index是热力图的行标, pt.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’