首页 > 其他分享 >Matplotlib库(一)

Matplotlib库(一)

时间:2023-02-12 14:23:34浏览次数:40  
标签:plot plt show Matplotlib 设置 np data

Matplotlib库(一)

matplotlib是python的2D图形包,pyplot封装了很多画图的函数。

导入相关的包:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

1. 基本绘图函数及相关设置

  • plt.show()函数

    默认情况下matplotlib.pyplot不会直接显示图像,只有调用plt.show()函数时才显示

    plt.show()默认在新窗口打开一幅图像

  • plt.plot()函数

    基本用法:plt.plot(x,y)

    plt.plot([1,2,3,4],[1,4,9,16])
    plt.show()
    ## 输出结果
    
plt.plot([1,2,3,4])    #绘制线图,y的值必须给定,x的值可以不用指定,默认使用索引0~(N-1)
plt.ylable('y')    #设置纵轴名称
plt.xlabel('x')    #设置横轴名称
  • 字符参数

    字符 颜色 字符 颜色
    'b' 蓝色 'm' 品红,magenta
    'g' 绿色 'y' 黄色
    'r' 红色 'k' 黑色
    'c' 青色,cyan 'w' 白色
    字符 类型 字符 类型 字符 类型 字符 类型
    '-' 实线 '--' 虚线 '_' 横线点 '-.' 虚点线
    '.' ':' 点线 ',' 像素点 'o' 圆点
    'v' 下三角点 '^' 上三角点 '<' 左三角点 '>' 右三角点
    '1' 下三叉点 '2' 上三叉点 '3' 左三叉点 '4' 右三叉点
    '+' 加号点 'x' 乘号点 'p' 五角点 '*' 星形点
    'h' 六边形点1 'H' 六边形点2 'D' 实心菱形点 'd' 瘦菱形点
    's' 正方点
    plt.plot([1,2,3,4],[1,4,9,16],'ro')  #设置为红色圆点
    plt.show()
    ## 输出结果
    
  • 显示范围 plt.axis([xmin,xmax,ymin,ymax])

    plt.plot([1,2,3,4],[1,4,9,16],'ro')  #设置为红色圆点
    plt.axis([0,5,0,20])
    plt.show()
    ## 输出结果
    
  • 传入numpy数组

    如果传入的是列表,matplotlib会在内部将列表转化为数组再进行处理。

    t = np.arange(0,5,0.2)    #生成0到5不包含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,color = 'r')  #linewidth设置线宽
    plt.show()
    ## 输出结果
    
  • 使用plt.plot()的返回值设置线条属性

    x = np.linspace(-np.pi,np.pi)
    y = np.sin(x)
    line1,line2 = plt.plot(x,y,'r-',x,y+1,'g-')
    line1.set_antialiased(False)   #可以直接对line1设置,取消抗锯齿
    plt.show()
    ## 输出结果
    
  • 使用plt.setp()修改线条性质

    x = np.linspace(-np.pi,np.pi)
    y = np.sin(x)
    line = plt.plot(x,y)
    plt.setp(line,color = 'g',linewidth = 4)
    #或者plt.setp(line,'color','g','linewidth',4)
    

2. 子图

  • figure(num)函数会产生一个指定编号为num的图

  • subplot可以在一幅图中生成多个子图

    plt.subplot(numrows,numcols,fignum)
    

    numrows:生成子图的总行数

    numcols:生成子图的总列数

    fignum:指定某个子图的序号

    numrows*numcols < 10 时,中间的逗号可以省略

  • 例如:

    def f(t):
        return np.exp(-t)*np.cos(2*np.pi*t)
    
    t1 = np.arange(0,5,0.1)
    t2 = np.arange(0,5,0.02)
    
    plt.figure(figsize = (10,6))
    plt.subplot(211)
    plt.plot(t1,f(t1),'bo',t2,f(t2),'r')
    
    plt.subplot(212)
    plt.plot(t2,np.cos(2*np.pi*t2),'k--')
    plt.show()
    ## 输出结果
    

3. 电影数据绘图

前期准备:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore')  #关闭警告提示
plt.rcParams['font.sans-serif'] = ['SimHei']   #图中可以正常显示中文
plt.rcParams['axes.unicode_minus'] = False   #图中可以正常显示负号
df = pd.read_excel('movie_data3.xlsx')   #读取豆瓣电影数据
df.head()    #查看前5行

3.1. 绘制柱状图

要求绘制每个国家的电影数量的柱状图:

data = df['产地'].value_counts()   #统计每个国家的电影数量
x = data.index
y = data.values

plt.figure(figsize = (10,6))    #打开一个10*6的画布
plt.bar(x,y,'g')   #绘制柱状图

plt.title('各国家电影数量',fontsize = 20)   #设置标题,字体大小为20
plt.xlabel('国家',fontsize = 18)       #设置横轴标题,字体大小为18
plt.ylabel('电影数量',fontsize = 18)       #设置纵轴标题,字体大小为18
plt.tick_params(labelsize = 14)  #设置坐标轴上的字体大小为14
plt.xticks(rotation = 90)    #设置横轴字体旋转90度

for a,b in zip(x,y):
    plt.text(a,b,b,ha = 'center',va = 'bottom',fontsize = 10)   #在(a,b)位置处添加文本,添加的是b的值,字体大小为10,ha设置水平居中,va设置垂直方向的位置
plt.show()      #展示图

3.2. 绘制曲线图

要求绘制每年上映的电影数量的曲线图:

data = df['年代'].value_counts()    #统计每年电影数量
data = data.sort_index()   #对索引排序
x = data.index
y = data.values

plt.plot(x,y,'b')
plt.title('每年电影数量',fontsize = 20)
plt.xlabel('年份',fontsize = 18)
plt.ylabel('电影数量',fontsize = 18)

for a,b in zip(x[::10],y[::10]):  #间隔十年添加文本
    plt.text(a,b+50,b,ha = 'center',va = 'bottom',fontsize = 10)

plt.annotate('2012年达到最大值',xy = (2012,data[2012]),xytext = (2025,2100),arrowprops = dict(facecolor = 'black',edgecolor = 'red'))  #xy是箭头尖的位置,xytext是箭头尾的位置,arrowprops设置箭头属性

plt.text(1980,1000,'电影数量开始快速增长')
plt.show()

3.3. 绘制饼图

要求根据电影长度绘制饼图:

plt.pie(x,explode = None,labels = None,colors = None,autopct = None,pctdistance = 0.6,shadow = False,labeldistance = 1.1,startangle = None,radius = None)

参数解释:

x:每一块的比例,如果sum(x)>1,会自动归一化

labels:每一块饼图外侧显示的说明文字

explode:每一块离开中心距离

startangle:开始绘制的角度,默认是从x轴正半轴逆时针画起,若等于90,则从Y轴正半轴开始

shadow:是否阴影

labeldistance:label绘制的位置,相对于半径的比例,如小于1则绘制在饼图内测

autopct:控制饼图内百分比设置

pctdistance:类似于labeldistance,指定autopct的位置

radius:控制饼图半径

data = pd.cut(df['时长'],[0,60,90,110,1000]).value_counts()   #将时长离散化为四个区间,并统计每个区间电影个数
y = data.values

plt.figure(figsize = (6,6))
plt.title('电影时长占比',fontsize = 15)
patches,l_text,p_text = plt.pie(y,labels = data.index,autopct = '%.1f %%',colors = 'rcyg')   #饼图的返回值分别是matplotlib.patches.Wedge对象序列、外部文字、内部文字,类型都是列表

for i in l_text:
    i.set_size(20)
    i.set_color('r')
for i in p_text:
    i.set_size(15)
    i.set_color('w')
    
plt.legend(loc = 'upper left')    #增加图例,位置是左上
plt.show()

3.4. 绘制频率分布直方图

要求绘制电影评分的频率分布直方图:

plt.figure(figsize = (10,6))
plt.hist(df['评分'],bins = 20,edgecolor = 'k',alpha = 0.5)    #bins设置直方图的柱子数量,默认是10;edgecolor设置柱子边框颜色;alpha设置透明度;facecolor设置直方图填充颜色;normed设置是否归一化,默认为0

返回值有:

n:直方图向量

bins:各个区间范围

patches:每个bin里面包含的数据,是一个列表

标签:plot,plt,show,Matplotlib,设置,np,data
From: https://www.cnblogs.com/DYDNyang/p/17113758.html

相关文章