我们今天继续来学习matplotlib,用matplotlib绘图是十分常见的情况,接下来我们用matplotlib绘制更加高级的图
首先,是我们的日常导入
import matplotlib.pyplot as plt
import pandas as pd #用于读取文件
import numpy as np
如果你不想看到过多的警告,可以使用下面的这一条指令
import warnings
warnings.filterwarnings('ignore')
修改字体类型,让负号正常显示
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
读取数据
data = pd.read_excel("movie_data3.xlsx", col_index = 0)
data.head()
接下来我们要画的图是双轴图,这种图的特点是两个y轴,共用一个x轴,这样我们可以清晰地知道某两个数据在同一个标准下的变化过程
import matplotlib.mlab as mlap
from scipy.stats import norm
hist()函数会返回n, bins, patches
参数值:hist的参数非常多,但常用的有以下6个,只有第一个是必须的,后面5个可选
x: 作直方图所要用的数据,必须是一维数组。多维数组可以先进行扁平化再作图
bins: 直方图的柱数,可选项,默认为10
normed: 是否将得到的直方图向量归一化。默认为0
facecolor: 直方图颜色
edgecolor: 直方图边框颜色
alpha: 透明度
histtype: 直方图类型,‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’
返回值:
n:直方图向量,是否归一化由参数normed设定。当normed取默认值时,n即为直方图各组内 元素的数量(各组频数)
bins: 返回各个bin的区间范围
patches:返回每个bin里面包含的数据,是一个list
fig = plt.figure(figsize = (5,5))
ax1 = fig.add_subplot(111) #第一行第一列第一个子图
n, bins, patches = ax1.hist(data['评分'], bins = 100, color = 'c')
#添加细节
ax1.set_xlabel('评分', fontsize = 10)
ax1.set_ylabel('数量', fontsize = 10)
ax1.set_title('电影评分频率直方图', fontsize = 15)
#设置另一个y轴
y = norm.pdf(bins, data['评分'].mean(), data['评分'].std())
ax2 = ax1.twinx() #共用一个x轴
ax2.plot(bins, y, 'r--')
ax2.set_ylabel('概率分布', fontsize = 15)
绘制散点图
x = data['时长']
y = data['评分']
plt.figure(figsize = (6,5))
plt.scatter(x, y) #画散点图要有x轴, y轴
plt.xlabel('时长', fontsize = 10)
plt.ylabel('评分', fontsize = 10)
plt.title('评分时长散点图', fontsize = 15)
由于数据太多,导致图形显示有点冗余,我们可以选取数据的百分之一来进行观察
x = data['时长'][::100]
y = data['评分'][::100]
plt.figure(figsize = (5,5))
plt.scatter(x, y) #画散点图要有x轴, y轴
plt.xlabel('时长', fontsize = 10)
plt.ylabel('评分', fontsize = 10)
plt.title('评分时长散点图', fontsize = 15)
绘制各个地区的箱线图
美国地区箱线图
df = data[data.产地 == '美国']['评分']
plt.figure(figsize = (5, 5))
plt.boxplot(df, whis = 2) #异常值为2
plt.title('美国电影箱线图', fontsize = 15)
plt.grid() #添加网格线
多组数据的箱线图
data1 = data[data.产地 == '中国大陆']['评分']
data2 = data[data.产地 == '日本']['评分']
data3 = data[data.产地 == '中国香港']['评分']
data4 = data[data.产地 == '法国']['评分']
data5 = data[data.产地 == '英国']['评分']
plt.figure(figsize = (10,10))
plt.boxplot([data1,data2,data3,data4,data5], labels=['中国大陆','日本','中国香港','法国','英国'], whis = 2)
plt.title('五个地区电影评分箱线图', fontsize = 15)
plt.grid()
用vert属性来旋转箱线图
plt.figure(figsize = (10,10))
plt.boxplot([data1,data2,data3,data4,data5], labels=['中国大陆','日本','中国香港','法国','英国'], whis = 2, vert = False)
plt.title('五个地区电影评分箱线图', fontsize = 15)
plt.grid()
%pylab inline
result = pd.plotting.scatter_matrix(data[::100], diagonal = 'kde', color = 'r', alpha = 0.5, figsize = (10, 10))
%pylab inline
reault = pd.plotting.scatter_matrix(data[::100], diagonal = 'hist', color = 'c', alpha = 0.5, figsize = (8,8))
使用seaborn库画热力图
import seaborn as sns
corr=data.corr()
corr=abs(corr)
fig=plt.figure(figsize=(10,8))
ax=fig.add_subplot()
ax=sns.heatmap(corr,vmax=1,vmin=0,annot=True)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)