zoukankan      html  css  js  c++  java
  • matplotlib中的bar图

    一、背景

    在最近的实验中需要使用到bar图用于数据的直观展示,这里记录一下内容。首先个人觉得虽然seaborn等工具会对这些工具进行二次封装,又时候使用起来是比较简洁,但是在做细节的设计没有这种原生的程序好,就像pip和conda、kersa和TensorFlow一样。

    二、基础用法

    bar图就是一个柱状图,需要引入的工具包如下

    import matplotlib.pyplot as plt
    

    引入工具包后,就可以开始创建画板、绘图、以及优化结果。

    2.1 基础概念

    下面介绍一些基础概念方便理解绘图过程。

    • 刻度:用于标记数据的单位长度。
    • 坐标:用于呈现图的位置,包括横坐标、纵坐标,如果是三维的话就是x,y,z这三个轴。
    • 坐标轴:用于表示数据的含义。
    • 宽度:用于衡量数据展示的大小。
    • label:用于描述坐标轴的含义。
      上面的内容是最基本的概念,在画图中会遇到的问题:
    1. 刻度 != 坐标:在画图的时候,很多代码写的时候刻度就是数据坐标,其实不然,这样的图调整起细节来很麻烦,因此画图的
    时候,最好将刻度和坐标的设置分离。坐标就是数据的点,与刻度无关。这样就可以调整出不同刻度下的图片。
    
    2. 宽度:宽度是数据的大小,有些作者画的分布图很好看,其实就是用width+数据量实现,通过紧密的数据+无限小的width就
    可以实现这种图。如果无法实现,第一个是宽度太大,另一个是数据不够紧密,很分散。
    
    3. 坐标轴:坐标轴一般会遇到的问题包括:
    	1. 设置范围,比如数据都是0.9+就没必要从0开始。
    	2. 需要科学技术法,以为数据过大的时候,科学技术法占位少。
    
    4. label != 坐标轴:在实际过程中需要新的指定轴的label。
    

    2.2 实现例子

    官网给的例子

    import matplotlib.pyplot as plt
    import numpy as np
    labels = ['G1', 'G2', 'G3', 'G4', 'G5']
    men_means = [20, 34, 30, 35, 27]
    women_means = [25, 32, 34, 20, 25]
    x = np.arange(len(labels))  # the label locations
    width = 0.35  # the width of the bars
    fig, ax = plt.subplots()
    rects1 = ax.bar(x - width/2, men_means, width, label='Men')
    rects2 = ax.bar(x + width/2, women_means, width, label='Women')
    rects3 = ax.bar(x + width / 2, women_means, width, label='after-adv', hatch="--", color="Silver", ec="black")
    # Add some text for labels, title and custom x-axis tick labels, etc.
    ax.set_ylabel('Scores')
    ax.set_title('Scores by group and gender')
    ax.set_xticks(x)
    ax.set_xticklabels(labels)
    ax.legend()
    ax.bar_label(rects1, padding=3)
    ax.bar_label(rects2, padding=3)
    fig.tight_layout()
    plt.show()
    

    这个关键的地方是多个bar并排在一起的问题。bar图绘制的过程如下:

    选取width的中点作为刻度的中心,在左右绘制,因此绘制的结果就是刻度的中心作为数据的中心位置,左右两边都是半个width
    因此如果需要绘制多个图时,另一个的图的坐标位置相对于刻度是1个width的宽度。
    

    举例:
    image

    三、技巧

    3.1 其余参数设计

    可以设置的参数很多,可以查看官网的源码查看

    plt.xlim(0, 0.6)  # 控制左边显示,y和x对应ylim和xlim
    # 科学计数法,需要scilimits的参数才可以实现,axis=('x', 'y')
    plt.ticklabel_format(style='sci', axis='y', scilimits=(0, 0))
    bar(hatch="||||")  # 其中hatch多写个会加重图形的展示。
    

    3.2 参数获取

    可以通过matplotlib输入参数名称,获取所有的参数,比如条形图中的marker,bar中的hatch等。

  • 相关阅读:
    程序设计课程技巧小总结
    《大学之路》读后感(1)
    《世界是数字的》读后感(4)
    《世界是数字的》读后感(3)
    《世界是数字的》读后感(2)
    《世界是数字的》读后感(1)——第一部分 硬件
    独立思考的能力——《不要等到毕业以后》读后感(2)
    迷茫且鉴定——《不要等到毕业以后》读后感(1)
    HashTable HashMap区分
    使用media query 来实现响应式设计
  • 原文地址:https://www.cnblogs.com/future-dream/p/15480544.html
Copyright © 2011-2022 走看看