zoukankan      html  css  js  c++  java
  • 03_Matplotlib的基本使用

    python利用Matplotlib.pyplot库绘制不同的图形,但是在显示中文时存在部分问题,一般在导入库后,添加如下代码:

    # 设置中文正常显示
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 设置负号正常显示
    plt.rcParams['axes.unicode_minus'] = False

    1.折线图

    一般折线图

    输入:

    # 画出折线图
    
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 设置中文正常显示
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 设置负号正常显示
    plt.rcParams['axes.unicode_minus'] = False
    
    # 读取数据
    unrate = pd.read_csv(r'D:codes_jupyter数据分析_learning课件3_matplotlibUNRATE.csv', engine='python')
    
    # 结合数据形式,将数据的日期格式进行转化
    unrate['DATE'] = pd.to_datetime(unrate['DATE'])
    print(unrate.head())
    
    # 画图
    First_twelve = unrate[0:12]  # 拿12个月份的数据进行画图
    
    # plot()画折线图。函数传入两个值,左边的值作为x轴,右边的值作为y轴
    plt.plot(First_twelve['DATE'], First_twelve['VALUE'])
    # show()函数显示图片
    plt.show()

    输出:

    折线图设置

    对折线图操作,添加标签、标题,并对坐标刻度进行设置

    输入:

    # 对折线图操作,添加标签、标题,并对坐标刻度进行设置
    
    unrate['DATE'] = pd.to_datetime(unrate['DATE'])
    First_12 = unrate[0:12]
    plt.plot(First_12['DATE'], First_12['VALUE'])
    
    # 对横坐标进行一定的变换
    # rotation=45 表示转动45°
    plt.xticks(rotation=90)
    
    # 添加标签
    plt.xlabel('月份')
    plt.ylabel('失业率')
    
    # 添加标题
    plt.title('1948年失业率走势')
    
    plt.show()

    输出:

    2.子图

      子图概念

     fig.add_subplot(4,1,x)函数画子图
     参数表示画4行1列,共4个子图,垂直排列,每行一个图,x表示第x个子图
     参数:(2,2,x)表示两行两列,4个图,每行2个图,x表示第x个子图
     参数:(2,3,x)表示2行3列,每行3个子图,x表示第x个子图

    绘制子图

    使用add_subplot()绘制子图,并通过figsize()制定画板大小

    输入:

    # add_subplot()添加子图,figsize()指定画板大小
    
    import matplotlib.pyplot as plt
    
    # figsize=(x, y)指定画板, 不填写参数表示默认值
    # fig = plt.figure()
    fig = plt.figure(figsize=(10, 6))  # 通过figsize=(x, y)指定画板大小
    
    # 对第一个子图进行操作
    ax1 = fig.add_subplot(2, 2, 1)
    ax1.plot(np.random.randint(1, 5, 5), np.arange(5))  # 生成随机整数
    
    # 对第二个子图进行操作
    ax2 = fig.add_subplot(2, 2, 2)
    ax2.plot(np.random.randint(1, 5, 5), np.arange(5))
    
    # 对第四个子图进行操作
    ax4 = fig.add_subplot(2, 2, 4)
    ax4.plot(np.random.randint(1, 5, 5), np.arange(5))
    
    plt.show()

    输出:

     绘制多条折线

    在一张图上画出多条折线

    输入:

    # 一张图上画出多条曲线
    
    # 拿到日期的月份。
    # dt.month获取datetime类型值的月份
    unrate['MONTH'] = unrate['DATE'].dt.month
    
    # 指定画板大小
    fig = plt.figure(figsize=(6, 3))
    
    # 画图  通过c='red'指定线条颜色
    plt.plot(unrate[:12]['MONTH'], unrate[:12]['VALUE'], c='red')
    plt.plot(unrate[12:24]['MONTH'], unrate[12:24]['VALUE'], c='blue')
    
    plt.show()

    输出:

    添加图例1

    使用for循环绘制多条折线,并添加对应的图例说明

    输入:

    # for循环画出多条折线,并添加图例说明
    
    fig = plt.figure(figsize=(10, 6))
    color = ['r', 'b', 'orange', 'black', 'green']
    
    for i in range(5):
        start_index = i * 12
        end_index = (i+1) * 12
        
        # 取范围
        subset = unrate[start_index: end_index]
        
        # 给每条线添加标签
        label = str(1948 + i)
        plt.plot(subset['MONTH'], subset['VALUE'], c=color[i], label=label)
    
    # 将图例说明自动放置合适位置
    plt.legend(loc='best', fontsize=10, ncol=2)  
    plt.show()
    
    # plt.legend()函数显示图例
    # loc参数设置位置
    # fontsize设置图例字体大小
    # ncols 设置用多少列显示图例
    # loc='best':将图例说自动添加到合适位置
    # loc='center':将图例放置在中心
    # 通过print(help(plt.legend))查看其它参数

    输出:

    设置线条宽度

    输入:

    # 设置线宽度
    
    fig = plt.figure(figsize=(10, 6))
    color = ['r', 'b', 'orange', 'black', 'green']
    for i in range(5):
        start_index = i * 12
        end_index = (i+1) * 12
        subset = unrate[start_index: end_index]
        label = str(1948 + i)
        
        # linewidth=10设置线宽度
        plt.plot(subset['MONTH'], subset['VALUE'], c=color[i], label=label, linewidth=8)
    plt.legend(loc='best', fontsize=10, ncol=2)  
    
    # xticks的size设置坐标刻度字体的大小,yticks同理设置
    plt.xticks(size=30)
    plt.yticks(size=15)
    
    # 添加标签和标题
    plt.xlabel('月份')
    plt.ylabel('失业率')
    plt.title('1948-1953年失业率走势图')
    
    plt.show()

    输出:

    添加图例2

    输入:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    women_degree = pd.read_csv(r'D:codes_jupyter数据分析_learning课件3_matplotlibpercent-bachelors-degrees-women-usa.csv', engine='python')
    
    # 设置颜色,label两侧的内容,图例,线宽
    plt.plot(women_degree['Year'], women_degree['Biology'], color='blue', label='Women', linewidth=10)
    plt.plot(women_degree['Year'], 100-women_degree['Biology'], c='green', label='Men', linewidth=10)
    
    # 在图中添加文本信息
    plt.text(2005, 35, 'Men', size=25)  # 在(2005,35)这个点添加信息,信息内容为后面的字符串,size为字体大小
    plt.text(2005, 55, 'Women')
    
    # 设置图例
    plt.legend(loc='upper right')
    
    # 设置title
    plt.title('Precentage of Biology Awarded By Gender')
    
    # 设置是否显示网格
    plt.grid(True)
    
    plt.show()

    输出:

    设置线型、点型及坐标轴

    输入:

    # 设置线型、点型、坐标轴
    
    plt.figure(figsize=(10, 6))
    x1 = np.arange(-2*np.pi, 2*np.pi, 0.01)
    x2 = np.arange(-2*np.pi, 2*np.pi, 0.2)
    
    y1 = np.sin(3*x2)/x2
    y2 = np.sin(2*x1)/x1
    y3 = np.sin(x1)/x1
    
    # linestyle设置线条类型;marker设置线条上点的风格
    plt.plot(x2, y1, c='b', linestyle='--', marker='^')
    plt.plot(x1, y2, c='r', linestyle='-')
    plt.plot(x1, y3, c='g')
    
    # 获取Axes对象
    ax = plt.gca()
    # spines['right']获取有边框
    ax.spines['right'].set_color('none')  # set_color设置颜色为none
    # spines['top']获取上边框
    ax.spines['top'].set_color('none')  # set_color设置颜色为none
    
    # 设置坐标轴
    ax.xaxis.set_ticks_position('bottom')  # 设置下边框为x轴
    ax.spines['bottom'].set_position(('data', 0))  # 获取下边框,set_position设置坐标轴位置
    
    ax.yaxis.set_ticks_position('left')  # 设置左边框为y轴
    ax.spines['left'].set_position(('data', 0))  # 设置y轴显示在刻度范围内,0的地方
    
    plt.show()
    
    # set_position()传入元组
    # ('data', 0) 表示将x轴放到数字0的位置
    # 下面的一个表示将y轴放到数字0的位置
    # 使用print(help(ax.spine['left'].set_position))查看帮助文档
    # data 表示将坐标轴设置在刻度范围内部
    # outwards 表示将坐标轴设置在整体刻度范围的最外面
    # 第一个0 表示x轴在y轴的刻度0的地方,第二个0同理

    输出:

    设置刻度及坐标轴显示

    输入:

    # 设置刻度的显示、显示图的一部分
    
    plt.figure(figsize=(10, 6))
    x1 = np.arange(-2*np.pi, 2*np.pi, 0.01)
    x2 = np.arange(-2*np.pi, 2*np.pi, 0.2)
    
    y1 = np.sin(3*x2)/x2
    y2 = np.sin(2*x1)/x1
    y3 = np.sin(x1)/x1
    
    # linestyle设置线条类型;marker设置线条上点的风格
    plt.plot(x2, y1, c='b', linestyle='--', marker='^')
    plt.plot(x1, y2, c='r', linestyle='-')
    plt.plot(x1, y3, c='g')
    
    # 设置要显示刻度的刻度值
    # plt.xticks([-2*np.pi, -np.pi, 0, np.pi, 2*np.pi])
    
    # 用后面的刻度,替换前面的刻度值
    plt.xticks([-2*np.pi, -np.pi, 0, np.pi, 2*np.pi], ['-2π', '', '0', 'π', ''], size=15)
    
    # 设置只显示刻度范围内的值
    # plt.xlim((-1 * np.pi, np.pi))
    # plt.ylim((0, 3))
    
    plt.show()

    输出:

     

    3.柱形图

    # 读取数据
    import pandas as pd
    
    review = pd.read_csv(r'D:codes_jupyter数据分析_learning课件3_matplotlibfandango_scores.csv', engine='python')
    cols = ['FILM', 'RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'RT_norm', 'Fandango_Stars']
    
    # 取出对应列
    norm_review = review[cols]
    norm_review.head()
    FILM    RT_user_norm    Metacritic_user_nom    IMDB_norm    RT_norm    Fandango_Stars
    0    Avengers: Age of Ultron (2015)    4.3    3.55    3.90    3.70    5.0
    1    Cinderella (2015)    4.0    3.75    3.55    4.25    5.0
    2    Ant-Man (2015)    4.5    4.05    3.90    4.00    5.0
    3    Do You Believe? (2015)    4.2    2.35    2.70    0.90    5.0
    4    Hot Tub Time Machine 2 (2015)    1.4    1.70    2.55    0.70    3.5

    一般柱形图

    输入:

    # plt.bar函数,画柱形图
    
    # 首先,指定柱的高度
    bar_height = norm_review.loc[0, cols[1:]].values  # 这里就取5家媒体对0号电影的评分值
    
    # 其次,指定柱的位置
    bar_position = np.arange(5) + 1
    # print(bar_position)
    
    plt.figure(figsize=(10, 6))
    
    # 使用plt.bar函数画柱状图
    plt.bar(bar_position, bar_height, 0.5)  # 0.5是设置柱的宽度
    plt.show()

    输出:

    设置柱状图的颜色、文本注释、坐标轴格式、标题和标签

    输入:

    # 设置柱状图的颜色、文本注释、坐标轴格式、标题和标签
    
    bar_height = norm_review.loc[0, cols[1:]].values
    bar_position = np.arange(5) + 1
    plt.figure(figsize=(10, 6))
    
    # color属性,设置颜色
    plt.bar(bar_position, bar_height, 0.5, color=['r', 'g', 'b'])  # 设置一种颜色直接color=‘r’
    
    # xticks替换坐标, 利用电影名替换1,2,3,。。。
    plt.xticks(bar_position, cols[1:])
    
    #设置标签和标题
    plt.xlabel("评分公司")
    plt.ylabel("评分")
    plt.title("5家公司对电影0的评分情况")
    
    # 利用plt.text方法,设置具体数值
    for x, y in zip(bar_position, bar_height):
        plt.text(x, y, '%.2f'% y, ha='center', va='bottom', size=14)
    
    # 说明:
    # plt.text()依次传入坐标和字符串内容
    # x,y 代表传入柱的位置和高度
    # '%.2f' 代表传入字符串的内容
    # ha='center' 设置文字水平对齐方式,其他参数查看帮助文档
    # va='bottom' 设置文字垂直对齐方式,其他参数查看帮助文档
    # size 设置字体大小
        
    plt.show()

    输出:

    横向柱形图

    输入:

    # plt.barh画横向柱状图
    
    # 设置柱的高度
    bar_width = norm_review.loc[0, cols[1:]].values
    # 设置柱的位置
    bar_position = np.arange(5) + 1
    
    # 设置画板大小
    plt.figure(figsize=(10, 6))
    
    # 设置标签和标题
    plt.xlabel('评分公司')
    plt.ylabel('分数')
    plt.title('公司评分分布图')
    
    # 设置坐标轴
    plt.yticks(bar_position, cols[1:])
    
    # 添加文本注释
    for x,y in zip(bar_width, bar_position):
        plt.text(x,y, '%.2f'%x, ha='left', va='center', size=14)
    
    # 画出柱状图
    plt.barh(bar_position, bar_width, 0.5, color=['r', 'g', 'b'])
    plt.show()

    输出:

    4.散点图

    一般散点图

    输入:

    # plt.scatter()画出散点图
    
    # 设置画板大小
    plt.figure(figsize=(10, 6))
    
    # 传入每个点的x,y坐标
    plt.scatter(norm_review['RT_user_norm'], norm_review['Metacritic_user_nom'])
    
    # 设置标签
    plt.xlabel('RT_user_norm')
    plt.ylabel('Metacritic_user_nom')
    plt.title('两家媒体对同一电影的评分')
    
    plt.show()

    输出:

    散点图加子图

    输入:

    # 散点图加子图
    
    # 新建画板
    fig = plt.figure(figsize=(10, 6))
    
    # 添加子图
    ax1 = fig.add_subplot(2, 1, 1)
    ax2 = fig.add_subplot(2, 1, 2)
    
    # 画出子图,并进行设置
    ax1.scatter(norm_review['RT_user_norm'], norm_review['Metacritic_user_nom'])
    ax1.set_xlabel('RT_user_norm')  # 添加标签
    ax1.set_ylabel('Metacritic_user_nom') 
    
    ax2.scatter(norm_review['RT_user_norm'], norm_review['Metacritic_user_nom'],s=10, c='r', marker='^' )
    # s=10 设置点的大小
    # c='r' 设置颜色
    # marker='^' 设置点的类型
    ax2.set_xlabel('RT_user_norm')  # 添加标签
    ax2.set_ylabel('Metacritic_user_nom')
    
    plt.show()

    输出:

    输入:

    """
    需求说明:
    读取pandas_practice数据
    一共两个科目的分数,
    通过的用红色 x 表示
    淘汰的用蓝色 . 表示
    添加图例等相关信息
    """
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    # 数据读取
    datas = pd.read_csv(r'D:codes_jupyter数据分析_learning课件3_matplotlibpandas_practice.csv', engine='python')
    
    # 指定画板大小
    fig = plt.figure(figsize=(10,4))
    
    # 取出所有通过的人Exam1分数和Exam2分数,添加标签,指定颜色和点型
    plt.scatter(datas['Exam1'][(datas['Admitted'] == 1)], datas['Exam2'][(datas['Admitted'] == 1)], label="通过", s=14, c='r', marker='x')
    # 取出所有淘汰的人的分数,添加相关内容
    plt.scatter(datas['Exam1'][(datas['Admitted'] == 0)], datas['Exam2'][(datas['Admitted'] == 0)], label="淘汰", s=14, c='b')
    
    
    # 添加标签
    plt.xlabel('科目1分数')
    plt.ylabel('科目2分数')
    
    # 添加图例
    plt.legend(loc='best')
    
    plt.show()

    输出:

     

    5.条形图

    数据展示:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    reviews = pd.read_csv(r'D:codes_jupyter数据分析_learning课件3_matplotlibfandango_scores.csv', engine='python')
    cols = ['FILM', 'RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'RT_norm', 'Fandango_Stars']
    
    norm_reviews = reviews[cols]
    norm_reviews.head()
    FILM    RT_user_norm    Metacritic_user_nom    IMDB_norm    RT_norm    Fandango_Stars
    0    Avengers: Age of Ultron (2015)    4.3    3.55    3.90    3.70    5.0
    1    Cinderella (2015)    4.0    3.75    3.55    4.25    5.0
    2    Ant-Man (2015)    4.5    4.05    3.90    4.00    5.0
    3    Do You Believe? (2015)    4.2    2.35    2.70    0.90    5.0
    4    Hot Tub Time Machine 2 (2015)    1.4    1.70    2.55    0.70    3.5

    频数分布图

    输入:

    # 对某家媒体的评分进行统计,拿到评分的频数分布,并画出频数分布图
    
    # 利用value_counts()函数,对不同评分进行统计,得到频数
    # fandango_distribute = norm_reviews['RT_user_norm'].value_counts()
    # print(fandango_distribute)
    
    # 利用sort_index()函数,按照索引排序
    # fandango_sort = fandango_distribute.sort_index()
    # print(fandango_sort)
    
    # plt.hist()函数画出频数分布图
    plt.hist(norm_reviews['RT_user_norm'], bins=20, range=(4, 5), edgecolor='black', rwidth=0.8)
    # bins=20 将原来数据的范围分为20份
    # edgecolot 设置边框的颜色
    # rwidth 设置条形的宽度
    # range=(4, 5) 可选参数 设置只显示4到5之间的频数分布
    
    plt.show()

    输出:

    6.三维图

     三维线图

    输入:

    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 构造一个3D画板
    fig = plt.figure()
    ax = Axes3D(fig)
    
    x = np.arange(-2, 2, 0.1)
    y = np.arange(-2, 2, 0.1)
    def f(x, y):
        return (x**2 + y**2)
    
    # 传入(x,y,z)坐标
    ax.plot(x, y, f(x, y), color='r')  # 画图
    
    # 设置标签
    ax.set_xlabel('x label')
    ax.set_ylabel('y label')
    ax.set_zlabel('z label')
    
    plt.show()

    输出:

    三维平面图

    输入:

    # 构造空间图
    
    # 构造一个3D画板
    fig = plt.figure()
    ax = Axes3D(fig)
    
    x = np.arange(-2, 2, 0.1)
    y = np.arange(-2, 2, 0.1)
    # 将x,y构成点矩阵
    x, y = np.meshgrid(x, y)
    
    def f(x, y):
        return (x**2 + y**2)
    
    # 传入(x,y,z)坐标
    ax.plot_surface(x, y, f(x, y), color='r')  # 画图
    
    # 设置标签
    ax.set_xlabel('x label')
    ax.set_ylabel('y label')
    ax.set_zlabel('z label')
    
    plt.show()

    输出:

    三维散点图

    输入:

    # 构造一个空间散点图
    
    # 构造一个3D画板
    fig = plt.figure()
    ax = Axes3D(fig)
    
    x = np.arange(-2, 2, 0.1)
    y = np.arange(-2, 2, 0.1)
    # 将x,y构成点矩阵
    x, y = np.meshgrid(x, y)
    
    def f(x, y):
        return (x**2 + y**2)
    
    # 传入(x,y,z)坐标
    ax.scatter3D(x, y, f(x, y), color='g', marker='*', s=10)  # 画图
    
    # 设置标签
    ax.set_xlabel('x label')
    ax.set_ylabel('y label')
    ax.set_zlabel('z label')
    
    plt.show()

    输出:

  • 相关阅读:
    对MVC模型的自悟,详尽解释,为了更多非计算机人员可以理解
    openSUSE leap 42.3 实现有线 无线同时用
    Fedora27 源配置
    Ubuntu16.04添加HP Laserjet Pro M128fn打印机和驱动
    openSUSE leap 42.3 添加HP Laserjet Pro M128fn打印机和驱动
    OpenSUSE Leap 42.3下通过Firefox Opera Chromium浏览器直接执行java应用程序(打开java jnlp文件)实现在服务器远程虚拟控制台完成远程管理的方法
    OpenSUSE Leap 42.3 安装java(Oracle jre)
    linux下支持托盘的邮件客户端Sylpheed
    Ubuntu下通过Firefox Opera Chromium浏览器直接执行java应用程序(打开java jnlp文件)实现在服务器远程虚拟控制台完成远程管理的方法
    Firefox 浏览器添加Linux jre插件
  • 原文地址:https://www.cnblogs.com/pythoner6833/p/9278494.html
Copyright © 2011-2022 走看看