Matplotlib库(二)
准备工作:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #图中可以显示中文
plt.rcParams['axes.unicode_minus'] = False #图中可以显示负号
df = pd.read_excel('movie_data3.xlsx') #读取豆瓣电影数据
1. 双轴图绘制
from scipy.stats import norm #用来计算概率分布
fig = plt.figure(figsize = (10,8))
ax1 = fig.add_subplot(111)
n,bins,patches = ax1.hist(df['评分'],bins = 100,colors = 'm')
ax1.set_ylabel('电影数量',fontsize = 15)
ax1.set_xlabel('评分',fontsize = 15)
ax1.set_title('频率直方图',fontsize = 20)
y = norm.pdf(bins,df['评分'].mean(),df['评分'].std()) #获得正态分布的概率密度函数
ax2 = ax1.twinx() #创建图ax2,与图ax1共用x轴
ax2.plot(bins,y,'b--')
ax2.set_ylabel('概率分布')
plt.show()
2. 绘制散点图
要求根据电影时长和电影评分绘制散点图:
x = df['时长']
y = df['评分']
plt.figure(figsize = (10,8))
plt.scatter(x,y,colors = 'c',marker = 'p')
plt.title('电影时长与评分散点图',fontsize = 20)
plt.xlabel('时长',fontsize = 15)
plt.ylabel('评分',fontsize = 15)
plt.show()
3. 箱线图
3.1. 单个箱线图
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:是否用线的形式表示均值,默认用点表示
showmeans:是否显示均值,默认不显示
showcaps:是否显示箱线图顶端和末端的两条线,默认显示
showbox:是否显示箱线图的箱体,默认显示
showfliers:是否显示异常值,默认显示
boxprops:设置箱体属性,如边框颜色、填充颜色等
labels:添加标签,类似于图例的功能
flierprops:设置异常值属性,如异常值点的形状、大小、填充颜色等
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':'y','lw':2})
plt.title('美国电影评分',fontsize = 20)
plt.show()
3.2. 多组数据箱线图
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'},vert = False)
ax = plt.gca()
ax.patch.set_facecolor('gray') #设置背景填充颜色
ax.patch.set_alpha(0.1) #设置背景透明度
plt.title('电影评分箱线图',fontsize = 20)
plt.show()
4. 相关系数矩阵图--热力图
data = df[['投票人数','评分','时长']]
## 使用pandas库中封装的函数画两两之间的散点图
%pylab inline
result = pd.plotting.scatter_matrix(data[::100],diagonal = 'hist',color = 'k',alpha = 0.3,figsize = (10,10))
-
用seaborn库画热力图
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',mask = None,ax = None)
data:矩阵数据集,可以是数组,也可以是DataFrame
vmin和vmax分别是热力图颜色取值的最小最大值
annot:默认是False,不显示注释
annot_kws:设置注释属性
例如,绘制投票人数、评分、时长之间相关系数的热力图:
import seaborn as sns corr = data.corr() #计算相关系数 corr = abs(corr) #取绝对值,只看相关关系大小,不看正相关还是负相关 fig = plt.figure(figsize = (10,8)) ax = fig.add_subplot(111) 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()