1. plot

1.1 hist

data = [0,1,2,5,6,5,8,7,64,66,5,8,8,8,8,8]
plt.hist(data, bins=3, label="weight")	

1.1.1 参数

  • bins,直方图的 bucket,bins = 3 表示将区间分为 3 buckets。数值范围是 0-66,那么大概分为 0-22,23-45,45-67 三个 bucket,然后根据 data 中的情况,往这几个 bucket 投票/计数。
  • range,x 轴的显示范围

1.2 通用设置

1.2.1 label 设置

给出y轴的名称

论文中时常需要设置 y 轴参数

plt.legend() 显示 label

plt.legend(loc='upper right', ncol=3, fontsize=30) 

ncol 设置行列如何排布,有时候需要排成一排,有时候需要排成一列

1.2.2 坐标轴刻度 scale

1.2.2.1 plt.xticks(), plt.yticks()

关于刻度的一些设置

xticks(locs, [labels], **kwargs)  # Set locations and labels
plt.yticks(np.arange(0.5, 1.3, step=0.05),family= 'Arial', weight= 'normal', size=20)

np.arange(0.5, 1.3, step=0.05) 设置刻度的范围和步长

不显示 y 轴刻度

yticks([])

1.2.2.2 plt.ylim((0.5, 1.3))

设置坐标轴范围,为 0.5-1.3

1.2.2.3 plt.xscale, plt.yscale 对数坐标轴

def draw():
    draw_max = resnet18_base.layer4_bb2_Conv2d_2['max']
    x = np.arange(0, len(draw_max))
    plt.plot(x, draw_max, color='r', label="max")
    plt.legend()
    plt.xscale('log') # 默认 base is 10
    plt.yscale('log', base=2) # 可以手动设置为 2
    plt.savefig('../img/fig_conv.png')
    plt.close()

对于 y 轴对数化比较简单。如果是对于 hist,x 轴想要使用 log 坐标轴,需要调整参数 bins

plt.ylabel('number')
plt.xlabel('value')
plt.hist( tmp_channel_list[i] , bins=20, color='green',label="activation channel", density=True)
plt.legend()
plt.title('Activation Distribution')
str_index = 'ep' + str(epoch_idx) + '_it' + str(iteration_idx) + '_l' + str(index) + '_c' + str(i) + '_' 
# plt.yscale('log', base=2)
# plt.xscale('log', base=2)
plt.savefig('/nvme/wmhu/work/ant_extension/ant_quantization/ImageNet/distri/img/' + args.model + '/chan_img/fig_'+ str_index +'.png')
plt.close()

1.2.3 其他

1.2.3.1 plt.title()

plt.title(filename, {'family' : 'Arial', 'weight' : 'normal', 'size' : 20})

1.2.3.2 plt.subplot()

这个是画图的时候比较常用的

    # 分成2x2,占用第一个,即第一行第一列的子图
    plt.subplot(2, 2, 1)
    filename = 'cifar'
    show_graph_cifar(filename)
    # 分成2x2,占用第一个,即第一行第一列的子图
    plt.subplot(2, 2, 2)
    filename = 'resnet'
    show_graph_resnet(filename)
	# 分成2x1,占用第二个,即第二行
    plt.subplot(2, 1, 2)
    filename = 'alex'
    show_graph_alex(filename)

效果

参数 ncol 设置列数,可以把他们排成一行

1.2.3.3 plt.grid

如何把网格放在最底层?zorder 似乎没有效果。虽然警告了 zorder unknown word,但是设置之后还是 work 了。

plt.grid(visible=True, which='major', axis='y', linestyle='--', zorder=0)

zorder 设置值比 bar 更小,就可以放在最底层了

1.2.3.4 plt.bar() 绘制直方图和叠加直方图

叠加直方图这次没做,不过不是很难,大概是给 bar 指定一个起始位置

plt.bar(x_length + bar_width,y_8,width=bar_width,label="8 entry", color='darkorange', edgecolor='black', zorder=3)

加上边框 edgecolor 会好看很多。

1.2.3.5 plt.subplots_adjust(bottom=0.35)

提前设置好 top, bottom, 各种空白等参数,让打出来的图片可以直接使用

1.2.3.6 color 参数

1.2.3.7 在服务器上使用 matplotlib / savefig

这里特指的是没有图形界面的服务器,需要将图片保存下来查看,而不能直接生成图片。

import matplotlib 
matplotlib.use('Agg')
# 在 plt 之前添加上述两行代码
import matplotlib.pyplot as plt

# 设置保存图片的位置
plt.savefig('/home/wmhu/share/figure/fig1.png')

# 如果需要绘制多个图片,记得在每一个 savefig 下面接一个 close ,不然会重叠
plt.close()