一、背景

在最近的实验中需要使用到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等。

posted on 2021-10-29 14:49  蔚蓝色の天空  阅读(805)  评论(0编辑  收藏  举报