matplotlib入门
Posted 临风而眠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matplotlib入门相关的知识,希望对你有一定的参考价值。
matplotlib入门(2):豆瓣电影数据可视化分析
参考教程:https://www.bilibili.com/video/BV1yi4y147A2?p=7&spm_id_from=pageDriver
一.preparations
- 导入库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
- 设置参数使得中文、负号等可以正常显示
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
plt.plot([1,2,3,4])
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.show()
检验效果:
- 读入数据
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('C:/Users/86171/Desktop/数模/数据分析三剑客/movie_data3.xlsx')
df.head()
二.电影数据绘图
1.每个国家/地区电影数量柱状图
柱状图(bar chart),以长方形的长度为变量,可以横向竖向排列或多维方式表达
先看数据
data=df['产地'].value_counts()
data
设置索引
#定义x,y轴
x=data.index
y=data.values
画图
基本的柱状图
plt.figure(figsize=(10,6))
plt.bar(x,y)
plt.show()
修改颜色
plt.bar(x,y,color='g')
设置标题,修改标题字体大小
plt.title("各国家或地区电影数量",fontsize=20)
对坐标轴进行说明
plt.xlabel('国家或地区',fontsize=16)
plt.ylabel("电影数量",fontsize=16)
设置坐标轴字体大小
调节字体等,使得没有那么挤
#坐标轴上的字的大小
plt.tick_params(labelsize=14)
#x轴上的字旋转90度
plt.xticks(rotation=90)
在图片上添加文本,设置文字说明
x=data.index
y=data.values
plt.figure(figsize=(10,6))
plt.bar(x,y,color='g')
plt.title("各国家或地区电影数量",fontsize=20)
plt.xlabel('国家或地区',fontsize=16)
plt.ylabel("电影数量",fontsize=16)
plt.tick_params(labelsize=14)
plt.xticks(rotation=90)
#zip函数打包成元组
for a,b in zip(x,y):
#坐标设置在(a,b+50) b+50是为了防止数字和下面的柱子有重叠
plt.text(a,b+50,b,ha='center',va='bottom',fontsize=10)
#bottom的意思是柱子在数字的下面
#top是数字在柱子的上边界的下面,即使前面设置了+50,也会在柱子的上边界的下面
plt.show()
可以设置网格
plt.grid()
2.每年上映的电影数量曲线图
曲线图/折线图
先看数据
data2 = df['年代'].value_counts()
data2
默认是排了序的,整理一下数据,发现2016年的电影数据异常
data2.sort_index()
排除掉异常数据
data2 = df['年代'].value_counts()
data2=data2.sort_index()[:-1]
data2
绘图
x2=data2.index
y2=data2.values
plt.plot(x2,y2,color='g')
plt.title('每年电影数量',fontsize=20)
plt.xlabel('年份',fontsize=15)
plt.ylabel('电影数量',fontsize=15)
plt.show()
每隔10年显示数据在线条上
x2=data2.index
y2=data2.values
plt.plot(x2,y2,color='g')
plt.title('每年电影数量',fontsize=20)
plt.xlabel('年份',fontsize=15)
plt.ylabel('电影数量',fontsize=15)
#每隔10年 step=10
for a,b in zip(x2[::10],y2[::10]):
plt.text(a,b+50,b,ha='center',va='bottom',fontsize=10)
plt.show()
标注文字等
x2=data2.index
y2=data2.values
plt.plot(x2,y2,color='g')
plt.title('每年电影数量',fontsize=20)
plt.xlabel('年份',fontsize=15)
plt.ylabel('电影数量',fontsize=15)
#每隔10年
for a,b in zip(x2[::10],y2[::10]):
plt.text(a,b+50,b,ha='center',va='bottom',fontsize=10)
#注释文字 , 被注释的坐标点 注释文字的坐标位置
plt.annotate('2012年达到最大值',xy=(2012,data2[2012]),xytext=(2025,2100),arrowprops=dict(facecolor='black',edgecolor='orange',headwidth=10))
plt.show()
增加文本说明
plt.text(2005,1000,'电影数量开始快速增长')
plt.show()
3.根据电影长度绘制饼图
统计各个时长区间的电影数量
- 设置区间,分组
data3=pd.cut(df['时长'],[0,60,90,110,1000]).value_counts()
data3
- 计算比例
y3=data3.values
y3=y3/sum(y3)
y3
其实不修改y3之后也会自动转化为比例
- 绘图
plt.figure(figsize=(10,10))
plt.title('电影时长占比',fontsize=15)
#%.2f %%表示要保留2位浮点数,并且空一格加一个百分号
plt.pie(y3,labels=data3.index,autopct='%.2f%%',colors='bygc',startangle=-90)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ujPVXvU4-1629710560328)(C:\\Users\\86171\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210822190031449.png)]
- 加上图例
plt.figure(figsize=(10,10))
plt.title('电影时长占比',fontsize=15)
#%.2f %%表示要保留2位浮点数,并且空一格加一个百分号
plt.pie(y3,labels=data3.index,autopct='%.2f%%',colors='bygc',startangle=-90)
plt.legend()
plt.show()
- 利用函数返回值进行各种操作
plt.figure(figsize=(10,10))
plt.title('电影时长占比',fontsize=15)
#%.2f %%表示要保留2位浮点数,并且空一格加一个百分号
#l_text饼图内部文字, p_text饼图外部文字
patches,l_text,p_text=plt.pie(y3,labels=data3.index,autopct='%.2f%%',colors='bygc',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('g')
plt.legend()
plt.show()
4.根据电影的评分绘制频率分布直方图
plt.figure(figsize=(10,6))
plt.hist(df['评分'],bins=20,edgecolor='k',alpha=0.5)
plt.show()
5.双轴图画法
Pre
import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab #配置参数 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False df=pd.read_excel('movie_data3.xlsx')
双轴图要使用.twinx()
from scipy.stats import norm
fig = plt.figure(figsize=(10,8))
#子图
ax1 = fig.add_subplot(111)
#需要用到直方图的返回值
# n直方图向量 bins范围 patches每一个bins包含的数据
n,bins,patches=ax1.hist(df['评分'],100,color='m')
ax1.set_ylabel("电影数量",fontsize=15)
ax1.set_xlabel("评分",fontsize=15)
ax1.set_title('频率分布图',fontsize=20)
#生成正态分布函数
#bins是上面的直方图返回值, mean期望 std标准差
y = norm.pdf(bins,df['评分'].mean(),df['评分'].std())
# y=norm.pdf(bins,loc=10,scale=2)
ax2=ax1.twinx()
ax2.plot(bins,y,'b--')
ax2.set_ylabel('概率分布',fontsize=15)
plt.show()
6.根据电影时长和电影评分绘制散点图
用两组数据构成多个坐标点,根据坐标点的分布,判断两变量之间的关系
散点图通常用于比较跨类别的聚合数据
画一画
- have a try, 用
plt.scatter
x=df['时长']
y=df['评分']
plt.figure(figsize=(10,8))
plt.scatter(x,y)
plt.title('电影时长与评分散点图',fontsize=20)
plt.xlabel('时长',fontsize=18)
plt.ylabel('评分',fontsize=18)
plt.show()
- 可以看出上面的数据非常冗杂,所以先选取部分数据来进行研究,用切片调节step,每隔step取一个数据
x=df['时长'][::120]
y=df['评分'][::120]
plt.figure(figsize=(10,6))
plt.scatter(x,y,color='c',marker='p')
plt.title('电影时长与评分散点图',fontsize=20)
plt.xlabel('时长',fontsize=18)
plt.ylabel('评分',fontsize=18)
plt.show()
marker属性
看看这位博主整理的优秀博文吧
7.绘制各个地区的评分箱形图
何为箱线图
一般计算过程
参数
美国电影评分箱线图
- 对异常值进行了一些设置
data = df[df['产地'] == '美国']['评分']
plt.figure(figsize = (10,6))
plt.boxplot(data,whis = 2, flierprops = {'marker':'o' , 'markerfacecolor' : 'r' , 'color' : 'k'})
plt.title('美国电影评分')
plt.show()
-
对箱体进行一些设置
patch_artist 设置箱体颜色
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'}) #浅紫色 plt.title('美国电影评分') plt.show()
多组数据箱线图
data1 = df[df['产地'] == '中国大陆']['评分']
data2 = df[df['产地'] == '英国']['评分']
data3 = df[df['产地'] == '法国']['评分']
plt.figure(figsize=(10,8))
plt.boxplot([data1,data2,data3],labels=['中国大陆','英国','法国'],whis=2,flierprops = {'marker':'o' , 'markerfacecolor' : 'r' , 'color' : 'k'},
patch_artist = True , boxprops = {'color':'k' , 'facecolor' : '#9999ff'})
#设置坐标轴颜色
#gca : get current axis
ax = plt.gca()
ax.patch.set_facecolor('cyan')
#设置背景的透明度
ax.patch.set_alpha(0.3)
plt.title('电影评分箱线图',fontsize=20)
plt.show()
vert属性
就在plt.boxplot里面加参数vert = False,就会翻转过来
data1 = df[df['产地'] == '中国大陆']['评分']
data2 = df[df['产地'] == '英国']['评分']
data3 = df[df['产地'] == '法国']['评分']
plt.figure(figsize=(10,8))
plt.boxplot([data1,data2,data3],labels=['中国大陆','英国','法国'],whis=2,flierprops = {'marker':'o' , 'markerfacecolor' : 'r' , 'color' : 'k'},
patch_artist = True , boxprops = {'color':'k' , Matplotlib常用绘图示例入门