(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