美文网首页
数据分析课程笔记 - 09 - Matplotlib

数据分析课程笔记 - 09 - Matplotlib

作者: 爱学习的ai酱 | 来源:发表于2020-11-28 21:30 被阅读0次

    大家好呀,今天我们学习数据分析课程的第九节课——用来做数据可视化的 Matplotlib。

    内容目录如下:

    1. 什么是 Matplotlib
    2. 为什么要学习 Matplotlib
    3. 常见图形种类及意义
    4. Matplotlib 画图的简单实现
    5. 对 Matplotlib 图像结构的认识
    6. 折线图
      (1)折线图的绘制
      (2)折线的颜色和形状设置
      (3)折点样式
      (4)设置的图片的大小和保存
      (5)绘制x轴和y轴的刻度
      (6)设置显示中文
      (7)一图多线
      (8)拓展一(一图多个坐标系子图)
      (9)拓展二(设置坐标轴范围)
      (10)拓展三(改变坐标轴的默认显示方式)
    7. 散点图
    8. 条形图
    9. 直方图
    10. 饼状图

    课前准备:安装 Matplotlib

    pip install -U matplotlib -i https://pypi.douban.com/simple
    

    一、什么是 Matplotlib?

    Matplotlib

    Matplotlib官网

    Matplotlib 是一个 Python 2D 绘图库,它可以让你仅用几行代码就可以生成直方图、折线图、条形图、饼状图、散点图等一些数据统计图形,还可以自定义设置图表元素的多种样式和属性。

    二、为什么要学习 Matplotlib?

    可视化是整个数据分析过程中的关键一步,它可以让我们更清晰地理解数据,从而调整我们的分析方法,也能让数据更加直观,更具有说服力。

    数据与图表的呈现效果对比

    三、常见图形种类及意义

    1、折线图

    折线图:以折线的上升或下降来表示统计数量的增减变化的统计图。

    折线图

    特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)

    2、散点图

    散点图: 用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。

    散点图

    特点:判断变量之间是否存在数量关联趋势,展示离群点。(分布规律)

    3、柱状图(条形图)

    柱状图: 又叫条形图,是一种以长方形的长度为变量的统计图表,一般用来表示数量型变量。

    柱状图

    特点: 绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)

    4、直方图

    直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据范围, 纵轴表示分布情况。

    直方图

    特点:绘制连续性的数据展示一组或者多组数据的分布状况。(统计)

    5、饼图

    饼图:用于表示不同分类的占比情况,通过弧度大小来对比各种分类。

    饼图

    特点:分类数据的占比情况。(占比)

    四、Matplotlib 画图的简单实现

    # 导入模块
    import matplotlib.pyplot as plt 
    # 在 jupyter 中执行的时候显示图片
    %matplotlib inline
    # 传入x和y, 通过plot画图
    plt.plot([1, 0, 9], [4, 5, 6])
    # 在执行程序的时候展示图形
    plt.show()
    
    结果

    五、对 Matplotlib 图像结构的认识

    Matplotlib图像结构

    通常情况下,我们可以将一张 Matplotlib 图像分成三层结构:

    1. 第一层是底层的容器层,主要包括 Canvas、Figure、Axes;
    2. 第二层是辅助显示层,主要包括 axis、spines、grid、legend、title等;
    3. 第三层为图像层,即通过 plot、scatter 等方法绘制的图像。

    六、折线图

    1、折线图的绘制

    from matplotlib import pyplot as plt 
    x = range(1,8)  # x轴的位置
    y = [17, 17, 18, 15, 11, 11, 13]
    # 传入x和y, 通过plot画折线图
    plt.plot(x,y) 
    plt.show()
    

    2、折线的颜色和形状设置

    from matplotlib import pyplot as plt 
    x = range(1,8) 
    # x轴的位置
    y = [17, 17, 18, 15, 11, 11, 13]
    # 传入x和y, 通过plot画折线图
    plt.plot(x, y, color='red',alpha=0.5,linestyle='--',linewidth=3) plt.show()
    '''基础属性设置
    color='red' : 折线的颜色
    alpha=0.5: 折线的透明度(0-1) 
    linestyle='--' : 折线的样式
    linewidth=3: 折线的宽度
    '''
    '''线的样式
    -   实线(solid)
    --  短线(dashed)
    -.  短点相间线(dashdot)
    :   虚点线(dotted) '''
    
    结果

    3、折点样式

    from matplotlib import pyplot as plt 
    x = range(1,8) # x轴的位置
    y = [17, 17, 18, 15, 11, 11, 13]
    # 传入x和y, 通过plot画折线图
    plt.plot(x, y, marker='o',color='red',markersize='20',markeredgecolor='g',markeredgewidth = 5) 
    plt.show()
    
    结果

    折点形状选择:

    character description
    '-' solid line style
    '--' dashed line style
    '-.' dash-dot line style
    ':' dotted line style
    '.' point marker
    ',' pixel marker
    'o' circle marker
    'v' triangle_down marker
    '^' triangle_up marker
    '<' triangle_left marker
    '>' triangle_right marker
    '1' tri_down marker
    '2' tri_up marker
    '3' tri_left marker
    '4' tri_right marker
    's' square marker
    'p' pentagon marker
    '*' star marker
    'h' hexagon1 marker
    'H' hexagon2 marker
    '+' plus marker
    'x' x marker
    'D' diamond marker
    'd' thin_diamond marker
    '|' vline marker
    '_' hline marker

    4、设置的图片的大小和保存

    from matplotlib import pyplot as plt 
    import random
    x = range(2,26,2) # x轴的位置
    y = [random.randint(15, 30) for i in x]
    
    # 设置图片的大小
    '''
    figsize:指定figure的宽和高,单位为英寸;
    dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80
    1英寸等于2.5cm,A4纸是 21*30cm的纸张
    '''
    # 根据画布对象
    plt.figure(figsize=(20,8),dpi=80) plt.plot(x,y) 
    # 传入x和y, 通过plot画图# 
    plt.show()
    # 保存(注意: 要放在绘制的下面,并且plt.show()会释放figure资源,如果在显示图像之后保存图片将只能保存空图片 。) plt.savefig('./t1.png')
    # 图片的格式也可以保存为svg这种矢量图格式,这种矢量图放在网页中放大后不会有锯齿
    # plt.savefig('./t1.svg')
    

    5、绘制 x 轴和 y 轴的刻度

    from matplotlib import pyplot as plt x = range(2,26,2) # x轴的位置
    y = [random.randint(15, 30) for i in x] plt.figure(figsize=(20,8),dpi=80)
    
    # 设置x轴的刻度
    # plt.xticks(x)
    # plt.xticks(range(1,25)) # 设置y轴的刻度
    # plt.yticks(y)
    # plt.yticks(range(min(y),max(y)+1))
    
    # 构造x轴刻度标签
    x_ticks_label = ["{}:00".format(i) for i in x] 
    #rotation = 45 让字旋转45度
    plt.xticks(x,x_ticks_label,rotation = 45)
    # 设置y轴的刻度标签
    y_ticks_label = ["{}℃".format(i) for i in range(min(y),max(y)+1)] plt.yticks(range(min(y),max(y)+1),y_ticks_label)
    
    plt.plot(x,y) 
    plt.show()
    
    结果

    6、设置显示中文

    #  matplotlib只显示英文,无法显示中文,需要修改matplotlib的默认字体# 通过matplotlib下的font_manager可以解决
    
    # 两个小时内的每分钟跳动变化
    from matplotlib import pyplot as plt 
    import matplotlib
    import random
    
    x = range(0,120)
    y = [random.randint(10,30) for i in range(120)]
    
    plt.figure(figsize=(20,8),dpi=80) 
    plt.plot(x,y)
    
    # 加坐标轴信息
    '''另外一种写法
    查看Linux、Mac下支持的字体
    终端执行: fc-list
    查看支持的中文(冒号前面有空格) fc-list :lang=zh
    查看Windows下的字体:“C:\Windows\Fonts\”
    
    可以自己下载字体文件(xxx.ttf),然后双击安装即可
    # my_font = font_manager.FontProperties(fname='/System/Library/Fonts/PingFang.ttc',size=18)  # plt.ylabel("天气",fontproperties=my_font)
    '''
    
    #rotation将字体旋转45度
    plt.xlabel('时间',rotation=45)
    
    from matplotlib import font_manager my_font =
    font_manager.FontProperties(fname='/System/Library/Fonts/PingFang.ttc',size=18) plt.ylabel("次数",fontproperties=my_font)
    
    # 设置标题
    plt.title('每分钟跳动次数',fontproperties=my_font,color='red')
    
    plt.show()
    
    结果

    7、一图多线

    #  假设大家在30岁的时候,根据自己的实际情况,统计出来你和你同事各自从11岁到30岁每年交的男/女朋友的数量如列表y1和y2,请在一个图中绘制出该数据的折线图,从而分析每年交朋友的数量走势。
    y1 = [1,0,1,1,2,4,3,4,4,5,6,5,4,3,3,1,1,1,1,1]
    y2 = [1,0,3,1,2,2,3,4,3,2,1,2,1,1,1,1,1,1,1,1]
    
    x = range(11,31) 
    # 设置图形
    plt.figure(figsize=(20,8),dpi=80)
    
    plt.plot(x,y1,color='red',label='自己')
    
    plt.plot(x,y2,color='blue',label='同事') 
    # 设置x轴刻度
    xtick_labels = ['{}岁'.format(i) for i in x] 
    my_font =
    font_manager.FontProperties(fname='/System/Library/Fonts/PingFang.ttc',size=18)
    plt.xticks(x,xtick_labels,fontproperties=my_font,rotation=45) 
    
    # 绘制网格(网格也是可以设置线的样式)
    #alpha=0.4 设置透明度
    plt.grid(alpha=0.4)
    
    #  添加图例(注意:只有在这里需要添加prop参数是显示中文,其他的都用fontproperties)
    # 设置位置loc : upper left、 lower left、 center left、 upper center plt.legend(prop=my_font,loc='upper right')
    
    #展示
    plt.show()
    
    结果

    8、拓展一(一图多个坐标系子图)

    import matplotlib.pyplot as plt 
    import numpy as np
    
    # add_subplot方法 给figure新增子图
    import numpy as np
    import matplotlib.pyplot as plt 
    
    x = np.arange(1, 100)
    
    #新建figure对象fig=plt.figure(figsize=(20,10),dpi=80) 
    #新建子图1
    ax1=fig.add_subplot(2,2,1) 
    ax1.plot(x, x)
    #新建子图2
    ax2=fig.add_subplot(2,2,2) 
    ax2.plot(x, x ** 2)
    ax2.grid(color='r', linestyle='--', linewidth=1,alpha=0.3) 
    #新建子图3
    ax3=fig.add_subplot(2,2,3) 
    ax3.plot(x, np.log(x)) 
    plt.show()
    
    ![结果](https://img.haomeiwen.com/i8919282/b9fe618be5a0900b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    ### 9、拓展二(设置坐标轴范围)
    
    

    import matplotlib.pyplot as plt
    import numpy as np
    x= np.arange(-10,11,1)
    y = x**2
    plt.plot(x,y)

    可以调x轴的左右两边

    plt.xlim([-5,5])

    只调一边

    plt.xlim(xmin=-4)

    plt.xlim(xmax=4)

    plt.ylim(ymin=0)
    plt.xlim(xmin=0)
    plt.show()

    
    ![结果](https://img.haomeiwen.com/i8919282/5dcdfc8972b90a00.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    ### 10、拓展三(改变坐标轴的默认显示方式)
    
    

    import matplotlib.pyplot as plt
    import numpy as np

    y = range(0,14,2)

    x轴的位置

    x = [-3,-2,-1,0,1,2,3]

    plt.figure(figsize=(20,8),dpi=80)

    获得当前图表的图像

    ax = plt.gca()

    设置图型的包围线

    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.spines['bottom'].set_color('blue')
    ax.spines['left'].set_color('red')

    设置底边的移动范围,移动到y轴的0位置,'data':移动轴的位置到交叉轴的指定坐标

    ax.spines['bottom'].set_position(('data', 0))
    ax.spines['left'].set_position(('data', 1))

    plt.plot(x,y)
    plt.show()

    
    ![结果](https://img.haomeiwen.com/i8919282/e082fc710bf34a27.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    ## 七、绘制散点图
    
    

    '''题干
    3月份每天最高气温a =
    [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
    '''
    from matplotlib
    import pyplot as plt
    from matplotlib import font_manager
    import numpy as np

    y = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
    x = range(1,32)

    设置图形大小

    plt.figure(figsize=(20,8),dpi=80)

    使用scatter绘制散点图

    size = np.random.randint(0, 100, 31)

    设置大小

    plt.scatter(x,y,label= '3月份',alpha=0.5,s=size,c='red')

    调整x轴的刻度

    my_font = font_manager.FontProperties(fname='/System/Library/Fonts/PingFang.ttc',size=10)

    _xticks_labels = ['3 月 {} 日 '.format(i) for i in x] plt.xticks(x[::3],_xticks_labels[::3],fontproperties=my_font,rotation=45)

    _yticks_labels = ['{}°C'.format(i) for i in range(min(y),max(y)+1)] plt.yticks(range(min(y),max(y)+1),_yticks_labels)

    plt.xlabel('日期',fontproperties=my_font)
    plt.ylabel('温度',fontproperties=my_font)

    图例plt.legend(prop=my_font)

    plt.show()

    
    ![结果](https://img.haomeiwen.com/i8919282/44e1f6e1ac65f59d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    
    ## 八、绘制条形图**
    
    

    '''http://58921.com/alltime
    假设你获取到了2019年内地电影票房前20的电影(列表a)和电影票房数据(列表b),请展示该数据:
    a = ['流浪地球','疯狂的外星人','飞驰人生','大黄蜂','熊出没·原始时代','新喜剧之王']
    b = ['38.13','19.85','14.89','11.36','6.47','5.93']
    '''

    from matplotlib import pyplot as plt
    from matplotlib import font_manager

    a = ['流浪地球','疯狂的外星人','飞驰人生','大黄蜂','熊出没·原始时代','新喜剧之王']

    b = ['38.13','19.85','14.89','11.36','6.47','5.93']

    b =[38.13,19.85,14.89,11.36,6.47,5.93]

    my_font = font_manager.FontProperties(fname='/System/Library/Fonts/PingFang.ttc',size=10)
    plt.figure(figsize=(20,8),dpi=80)

    绘制条形图

    rects = plt.bar(a,[float(i) for i in b],width=0.3,color= ['r','g','b','r','g','b'])
    plt.xticks(range(len(a)),a,fontproperties=my_font)
    plt.yticks(range(0,41,5),range(0,41,5))

    在条形图上加标注(水平居中)

    for rect in rects:
    height = rect.get_height()
    plt.text(rect.get_x() + rect.get_width() / 2, height+0.3, str(height),ha="center")

    plt.show()

    
    ![结果](https://img.haomeiwen.com/i8919282/805f1d7b31accd3b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    **横向条形图**
    
    

    横向柱状图

    from matplotlib import pyplot as plt
    from matplotlib import font_manager

    my_font =
    font_manager.FontProperties(fname='/System/Library/Fonts/PingFang.ttc',size=10)
    a = ['流浪地球','疯狂的外星人','飞驰人生','大黄蜂','熊出没·原始时代','新喜剧之王']
    b = [38.13,19.85,14.89,11.36,6.47,5.93]

    plt.figure(figsize=(20,8),dpi=80)

    绘制条形图的方法

    '''
    height=0.3 条形的宽度

    '''
    # 绘制横向的条形图
    # plt.bar(y,x,width = 0.4)
    rects = plt.barh(range(len(a)),b,height=0.5,color='r') plt.yticks(range(len(a)),a,fontproperties=my_font,rotation=45)
    
    # 在条形图上加标注(水平居中) 
    for rect in rects:
        # print(rect.get_x()) 
        width = rect.get_width()
        plt.text(width, rect.get_y()+0.5/2, str(width),va="center")
    
    plt.show()
    
    结果

    并列和罗列条形图

    import matplotlib.pyplot as plt
    import numpy as np
    
    index = np.arange(4) 
    BJ = [50,55,53,60]
    Sh = [44,66,55,41]
    
    # 并列
    plt.bar(index,BJ,width=0.3) plt.bar(index+0.3,Sh,width=0.3,color='green')
    
    plt.xticks(index+0.3/2,index) 
    # 罗列
    # plt.bar(index,Sh,bottom=BJ,width=0.3,color='green') 
    plt.show()
    
    image.png
    image.png

    九、直方图

    这部分由于原始数据太多,不好呈现,所以放张图给大家,大家可以自己找一些数据放在本地练习一下。

    image.png

    十、饼状图

    import matplotlib.pyplot as plt 
    import matplotlib
    from matplotlib import font_manager 
    my_font =
    font_manager.FontProperties(fname='/System/Library/Fonts/PingFang.ttc',size=10)
    
    label_list = ["第一部分", "第二部分", "第三部分"]   
    # 各部分标签
    size = [55, 35, 10] 
    # 各部分大小
    color = ["red", "green", "blue"]    
    # 各部分颜色
    explode = [0, 0.05, 0]  
    # 各部分突出值
    """
    绘制饼图
    x : (每一块)的比例,如果sum(x)>1,会将多出的部分进行均分; explode: (每一块)离开中心距离
    labels: (每一块)饼图外侧显示的说明文字; 
    labeldistance:设置标签文本距圆心位置,1.1表示1.1倍半径autopct:控制饼图内百分比设置
    shadow:设置是否有阴影
    startangle:起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起; 
    pctdistance:类似于labeldistance,指定autopct的位置刻度,默认值为0.6;
    返回值:
    patches : matplotlib.patches.Wedge列表(扇形实例) 
    l_text:label matplotlib.text.Text列表(标签实例) 
    p_text:label matplotlib.text.Text列表(百分比标签实例) 
    """
    
    plt.figure(figsize=(20, 8), dpi=100) 
    patches, l_text, p_text = plt.pie(size, explode=explode, colors=color, labels=label_list, labeldistance=1.1, autopct="%1.1f%%", shadow=False, startangle=90, pctdistance=0.6)
    
    for t in l_text: 
        print(dir(t))
        t.set_fontproperties(my_font)
    
    for t in p_text: 
        t.set_size(18)
    
    for i in patches: 
        i.set_color('pink') 
        break
    
    plt.show()
    

    pie 函数参数详解,英文原版请参见:matplotlib官网pie函数

    结果

    十一、总结

    总结

    相关文章

      网友评论

          本文标题:数据分析课程笔记 - 09 - Matplotlib

          本文链接:https://www.haomeiwen.com/subject/zisdiktx.html