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)

在图片上添加文本,设置文字说明

plt.text()函数解析

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()

标注文字等

plt.annotate()函数详解

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常用绘图示例入门

Python数据可视化利器Matplotlib从入门到高级4

Matplotlib

Matplotlib光速入门-从安装到常用实战

推荐net开发cad入门阅读代码片段

Matplotlib 入门