python数据分析(Matplotlib)

(1)plt.show()函数

默认情况下,matplotlib.pyplot不会直接显示图像,只有调用plt.show()函数时,图像才会显示出来。

plt.show()默认是在新窗口打开一幅图像,并且提供了对图像进行操作的按钮。

不过在ipython命令行中,我们可以将它插入notebook中,并且不需要调用plt.show()也可以显示:

%matplotlib notebook

%matplotlib inline

不过在实际写程序中,我们还是习惯调用plt.show()函数将图像显示出来。

(2)plt.plot()函数

例子:绘制线型图

plt.plot([1,2,3,4])

plt.ylabel("y"),给Y轴名称赋值。

plt.xlabel("x轴"),给X轴名称赋值。(注意:中文可能显示会乱码)

基本用法

plot函数基本用法,指定x和y,plt.plot(x,y)

默认参数,x为0~N-1

plt.plot(y)

因此,在上面的例子中,我们没有给定X的值,所以默认值为[0,1,2,3]

传入x和y:plt.plot([1,2,3,4],[1,4,9,16]),会直接生成图像,也可以直接plt.show(),相当于打印图像处理出来了。

字符参数

表示颜色的字符参数有:

"b",蓝色,blue

"g",绿色,green

"r",红色,red

"c",青色,cyan

"m",品红,magenta

"y",黄色,yellow

"k",黑色,black

"w",白色,white

表示类型的字符参数有:

"-",实线

"--",虚线

"-.",虚点线

":",点线

".",点

",",像素点

"o",圆点

"v",下三角点

"^",上三角点

"<",朝左三角形

">",朝右三角形

"1",下三叉点

"2",上三叉点

"3",左三叉点

"4",右三叉点

"s",正方形

"p",五角点

"*",星形点

"h",六边形点1

"H",六边形点2

"+",加号点

"x",乘号点

"D",钻石形/菱形

"d",小版钻石形/菱形

"_",横线点

"|",垂直线型

例如,我们要画出红色圆点:

plt.plot([1,2,3,4],[1,4,9,16],"ro")

plt.axis([0,6,0,20]),指定坐标轴显示范围plt.axis([xmin,xmax,ymin,ymax]),和MATLAB类似。

plt.show()

传入Numpy数组,在一个图里面画多条线。

t=np.arange(0.,5.,0.2)

plt.plot(t,t,"r--",t,t**2,"bs",t,t**3,"g*")

plt.show()

线条属性

x=np.linspace(-np.pi,np.pi)

y=np.sin(x)

plt.plot(x,y,linewidth=4.0,color="r"),这个参数是设置线条宽度、颜色。

plt.show()

使用plt.plot()的返回值来设置线条属性

plot函数返回一个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.set_antialiased(False),抗锯齿功能(不光滑)

plt.show()

plt.setp()修改线条性质

line-plt.plot(x,y)

plt.setp(line,color="g",linewidth=4)

子图的绘制

figure()函数会产生一个指定编号为num的图:

plt.figure(num)

使用suplot可以在一幅图中生成多个子图。

plt.subplot(numrows,numcols,fignum)

当行列小于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),0.0到5.0之间步长为0.1的数组

t1=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")

 

plt.subplot(212)

plt.plot(t2,no,cos(2*np.pi*t2),"r--")

plt.show()

 

电影数据绘图

关闭警告功能

import warnings

warnings.filterwarnings("ignore")

导入库

import pandas as pd

import numpy as np

import mathplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei'],设置为黑体

plt.rcParams["axes.unicode_minus"]=False,正常显示负号

以上是雷达不变的设置,写在前面就行。

(1)绘制每个国家或地区的电影数量的柱状图

data=df["产地"].value_counts()

x=data.index

y=data.values

plt.figure(figsize=(10.6)),figsize主要设置图片大小

plt.title("各国家或地区电影数量",fontsize=20),设置标题和字体大小。

plt.xlabel("国家或地区",fontsize=18),x轴的标题

plt.ylabel("电影数量",fontsize=18),y轴的标题

plt.tick_params(labelsize=14),坐标轴的字体的大小

plt.xticks(rotation=90),把坐标轴名称顺序,横纵向转换。

for a,b in zip(x,y):

     plt.text(a,b+10,b,ha="center",va="bottom",fontsize=10),第一个a是x轴的位置,第二个b是y轴的位置(稍微上去一点避免重合),第三个b是y的值,第四个是水平对齐,第五个垂直对齐bottom是图形在字体下面,top会有重叠,所以用bottom,第六个是字体大小。

plt.grid(),在图像中画网格线。

plt.bar(x,y,color="g"),这就是设定柱状图

(2)绘制每年上映的电影数量的曲线图/折线图

如果画线图,就要写

x=什么

y=什么

plt.plot(x,y,color="b"),线图用这句,柱状图没有这句

如果要每隔十年显示一个数据,和柱状图不同

for a,b in zip(x[::10],y[::10]):

     plt.text(a,b+10,b,ha="center",va="bottom",fontsize=10)

添加极值点,facecolor是箭头的填充颜色,edgecolor是箭头的边缘颜色,xy是注释位置,xytext是注释文字位置。

plt.annotate("2012年达到最大值",xy=(2012,data[2012]),xytext=(2025,2100),arrrowprops=dict(facecolor="black",edgecolor="red"))

plt.text(1980,1000,"电影数量开始快速增长"),指定位置放文本文字

plt.show()

(3)根据电影的长度绘制饼图,用于分类不是很多的数据

函数原型pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, hold=None, data=None)

参数:
x(每一块)的比例,如果sum(x)>1会使用sum(x)归一化

labels(每一块)饼图外侧显示的说明文字

exlode(每一块)离开中心的距离

startangle起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起。

shadow在饼图下面画一个阴影。默认值:False,即不画阴影;

labeldistance:labe绘制位置,相对于半径的比例,默认值为1.1,如<1则绘制在饼图内侧

autopct空值饼图内百分比设置,可以使用format字符串或者format function,"%1.1f"指小数点前后位数(没有用空格补齐),%.1f小数位一位的浮点数。"%.1f %%"百分之几点几这样。

pctdistance类似于labeldistance,指定autopct的位置刻度,默认值为0.6

radius控制饼图半径,默认值为1.

counterclock :指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时针。

wedgeprops :字典类型,可选参数,默认值:None。参数字典传递给wedge对象用来画一个饼图。例如:wedgeprops={'linewidth':3}设置wedge线宽为3。

textprops :设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。传递给text对象的字典参数。

center :浮点类型的列表,可选参数,默认值:(0,0)。图标中心位置。

frame :布尔类型,可选参数,默认值:False。如果是true,绘制带有表的轴框架。

rotatelabels :布尔类型,可选参数,默认为:False。如果为True,旋转每个label到指定的角度。

返回值:如果没有设置autopct,返回(patches,texts)如果设置了,就会返回(patches,texts,autopct)。

data=pd.cut(df["时长"],[0,60,90,110,1000]).value_counts()

y=data.values

y=y/sum(y),可有可无,因为会自动归一化。

plt.figure(figsize=(10,10)) ,饼图尽可能使用正方向的图形,不然会压扁,很丑。

plt.title("电影时长占比",fontsize=15)

patches,1_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 1_text:

     i.set_size(15)

     i.set_color("r")     这是饼图外的数据

plt.legend(),这是加图例的代码

plt.show()

(4)根据电影评分绘制频率分布直方图

plt.figure(figsize=(10,6))

plt.hist(df["评分"],bins=20) ,这基本的图就出来了。

也可以继续加条件加黑色边框,plt.hist(df["评分"],bins=20,edgecolor="k")

直方图颜色太深,想调淡一点,plt.hist(df["评分"],bins=20,edgecolor="k",alpha=0.5)

plt.show()

参数:很多,但常用的就6个,第一个的必须,后面可选

arr:需要计算直方图的一维数组。

bins:直方图的柱数,可选项,默认值为10

normed:是否将得到的直方图向量归一化,默认值为0

facecolor:直方图颜色

edgecolor:直方图边框颜色

alpha:透明度

histtype:直方图类型,"bar","barstacked","step","stepfilled"

直方图进阶——双轴图的画法,就是在直方图上加了条线

import matplotlib.mlab as mlab

plt.figure(figsize=(10,8))

ax1=fig.add.subplot(111),一行一列的图,画的第一个。

n,bins,patches=ax1.hist(df["评分"],bins=20,edgecolor="k",color="m")

ax1.set_ylabel("电影数量",fontsize=15)

ax1.set_xlabel("评分",fontsize=15)

ax1.set_title("频率分布图",fontsize=20)

y=mlab.normpdf(bins,df["评分"].mean(),df["评分"].std())

ax2=ax1.twinx()

ax2.plot(bins,y,"b--")

ax2.set_ylabel("概率分布",fontsize=15)

plt.show()

(5)根据电影时长和电影评分绘制散点图

x=df["时长"][::100]

y=df["评分"][::100]

plt.figure(figsize=(10,6))

plt.scatter(x,y,color="c",marker="*")

plt.legend()

plt.title("电影时长与评分散点图",fontsize=20)

plt.xlabel("时长",fontsize=18)

plt.ylabel("评分",fontsize=18)

plt.show()

由于数据量太大,所以画出的图很冗杂,所以选取原来的百分之一。就在x,y的代码上去修改。

(6)绘制各个地区的评分箱形图

一般计算过程

1、计算上四分位数(Q3),中位数,下四分位数(Q1)

2、计算上四分位数和下四分位数之间的差值,即四分位数差(IQR)Q3-Q1

3、绘制箱线图的上下范围,上限为上四分位数,下限为下四分位数。在箱子内部中位数的位置绘制横线。

4、大于上四分位数1.5倍的四分位数差的值,或者下雨下四分位数1.5倍四分位数差的值,划为异常值。

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,bootstrap=None,usermedians=None,conf_intervals=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,manage_xticks=True,autorange=False,zorder=None,hold=None,data=None)

x:指定要绘制箱线图的数据;

notch:是否是凹口的形式展现箱线图,默认非凹口;

sym:指定异常点的形状,默认为+号显示;

vert:是否需要将箱线图垂直摆放,默认垂直摆放;

whis:指定上下须与上下四分位的距离,默认为1.5倍的四分位差;

positions:指定箱线图的位置,默认为[0,1,2…];

widths:指定箱线图的宽度,默认为0.5;

patch_artist:是否填充箱体的颜色;

meanline:是否用线的形式表示均值,默认用点来表示;

showmeans:是否显示均值,默认不显示;

showcaps:是否显示箱线图顶端和末端的两条线,默认显示;

showbox:是否显示箱线图的箱体,默认显示;

showfliers:是否显示异常值,默认显示;

boxprops:设置箱体的属性,如边框色,填充色等;

labels:为箱线图添加标签,类似于图例的作用;

filerprops:设置异常值的属性,如异常点的形状、大小、填充色等;

medianprops:设置中位数的属性,如线的类型、粗细等;

meanprops:设置均值的属性,如点的大小、颜色等;

capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等;

whiskerprops:设置须的属性,如颜色、粗细、线的类型等;

美国电影评分的箱线图

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"})

浅紫色:#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")

以下三行是对图像的背景进行设置。

ax=plt.gca()

ax.patch.set_facecolor("gray")

ax.patch.set_alpha(0.3)

plt.title("电影评分箱线图",fontsize=20)

plt.show()

通过vert属性可以把图像旋转过来。vert=Fasle就是横向展示。

(7)相关系数矩阵图——热力图

data=df[["投票人数","评分","时长"]]

画出各个属性之间的散点图,对角线是分布图,diagonal="hist",对角线就是直方图,kde就是核密度估计

%pylab inline

result=pd.scatter_matrix(data[::100],diagonal="kde",color="k",alpha=0.3,figsize=(10,10))

画出电影时长,投票人数,评分的一个相关系数矩阵图。

seaborn是一个精简的python库,可以直接用pandas的DataFrame类型。

import seaborn as sns

corr=data.corr()

只看相关程度,不看正负相关就加一句corr=abs(corr)

fig=plt.firue(figsize=(10,8))

ax=fig.add_subplot(figsize=(10,8))

ax=sns.heatmap(corr,vmax=1,vmin=0,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, center=None, robust=False, annot=None, fmt=’.2g’, annot_kws=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类下的字体设置;官方文档:https://matplotlib.org/api/text_api.html#matplotlib.text.Text

4、热力图矩阵块之间间隔及间隔线参数: 

linewidths:定义热力图里“表示两两特征关系的矩阵小块”之间的间隔大小 

linecolor:切分热力图上每个矩阵小块的线的颜色,默认值是’white’

5、热力图颜色刻度条参数: 

cbar:是否在热力图侧边绘制颜色刻度条,默认值是True 

cbar_kws:热力图侧边绘制颜色刻度条时,相关字体设置,默认值是None 

cbar_ax:热力图侧边绘制颜色刻度条时,刻度条位置设置,默认值是None

square:设置热力图矩阵小块形状,默认值是False 

xticklabels, yticklabels:xticklabels控制每列标签名的输出;yticklabels控制每行标签名的输出。默认值是auto。如果是True,则以DataFrame的列名作为标签名。如果是False,则不添加行标签名。如果是列表,则标签名改为列表中给的内容。如果是整数K,则在图上每隔K个标签进行一次标注。 如果是auto,则自动选择标签的标注间距,将标签名不重叠的部分(或全部)输出 

mask:控制某个矩阵块是否显示出来。默认值是None。如果是布尔型的DataFrame,则将DataFrame里True的位置用白色覆盖掉 
ax:设置作图的坐标轴,一般画多个子图时需要修改不同的子图的该值 

**kwargs:All other keyword arguments are passed to ax.pcolormesh

 

你可能感兴趣的:(数据分析进阶之Python,自己)