文章目录

  • 前言
  • 一、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()

结果如下:

python matplotlib plot label不显示 python matplotlib show_数据


我们可以对轴上做一些设定:

plt.plot([1,2,3,4])#默认情况下[1,2,3,4]表示y 的
plt.ylabel('y')#y轴的标签
plt.xlabel('x')#x轴的标签
plt.show()

结果如下:

python matplotlib plot label不显示 python matplotlib show_python_02


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()

结果如下:

python matplotlib plot label不显示 python matplotlib show_python_03


显示范围

我们可以调整图形的显示范围,这个和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()

结果如下:

python matplotlib plot label不显示 python matplotlib show_饼图_04


传入Numpy数组

之前画的图都是列表,但是现实分析数据的时候更加常见的是numpy数组。事实上,如果我们传入的是列表,matplotlib会在内部将它转化成数组再进行处理。

在图里面画多个线条

t = np.arange(0.,5.,0.2)
plt.plot(t,t,'g--',
        t,t**2,'bs',
        t,t**3,'g^')#可分行,可不分

结果如下:

python matplotlib plot label不显示 python matplotlib show_饼图_05


线条属性

我们可以通过关键词来改变线条的性质,例如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()

结果如下:

python matplotlib plot label不显示 python matplotlib show_python_06


这个调整和上面的字符差不多。

使用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()

结果如下:

python matplotlib plot label不显示 python matplotlib show_饼图_07


对line1进行操作后就不像绿色的曲线光滑。

plt.setp()修改线条性质
这是一个更加简便的方法

line = plt.plot(x,y)
plt.setp(line,color='g',linewidth=5)

结果如下:

python matplotlib plot label不显示 python matplotlib show_python_08


子图

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

结果如下:

python matplotlib plot label不显示 python matplotlib show_饼图_09

二、电影数据绘图

导入需要用的库

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()

结果如下:

python matplotlib plot label不显示 python matplotlib show_饼图_10


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()

结果如下:

python matplotlib plot label不显示 python matplotlib show_python_11


总结:

  • 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()

结果如下:

python matplotlib plot label不显示 python matplotlib show_数据_12


我还可以通过函数的返回值来设定字体:

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()

结果如下:

python matplotlib plot label不显示 python matplotlib show_饼图_13


可以根据前面的方法来设置标题这些。

(五)绘制双轴图

根据(四)绘制的直方图的基础上绘制双轴图

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()

结果如下:

python matplotlib plot label不显示 python matplotlib show_饼图_14

(六)绘制散点图

散点图主要是看两变量之间是否有关联。

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()

结果如下:

python matplotlib plot label不显示 python matplotlib show_python_15

(七)绘制箱线图

箱形图(Box-plot )又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理。它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比较。箱线图的绘制方法是:先找出一组数据的中位数、两个四分位数、上下边缘线;然后,连接两个四分位数画出箱子;再将上下边缘线与箱子相连接,中位数在箱子中间。

箱线图大致形状:

python matplotlib plot label不显示 python matplotlib show_饼图_16


一般的步骤

(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()

结果如下:

python matplotlib plot label不显示 python matplotlib show_饼图_17


多组数据箱线图

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()

结果如下:

python matplotlib plot label不显示 python matplotlib show_python_18


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()

结果如下:

python matplotlib plot label不显示 python matplotlib show_python_19