用Matplotlib画水平柱状图和折线图的个人使用心得与总结

从4月5号到18号研究了两周的matplotlib,算是小有收获。网上关于matplotlib的使用大大小小问题的回答并不是很全面比较零碎,有些还是得靠摸索。这段时间主要研究了水平柱状图和折线图的使用,总结并记录一下。

水平柱状图

# 导入绘图包,分别导入避免出错,尽量不用from pylab import *
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as patches

第一步,一定是定义一个画布

# 绘图窗口尺寸(6英寸,5英寸),分辨率120,背景颜色设置为白色
plt.figure(figsize=(6,5),dpi=120,facecolor='white')
# 可显示中文字,字体为雅黑
plt.rcParams['font.sans-serif'] = ['SimHei']
# 刻度值可以显示负数,避免显示问题
plt.rcParams['axes.unicode_minus'] = False
# 可以调用各种风格,这个风格无边框,不用额外设置,看着干净,用的比较多
# 可以使用plt.style.available获取所有美化样式,选择一个合适的
plt.style.use('fivethirtyeight')

第二步,我自己把水平柱状图分为单柱和多柱。

# 不管多少柱,保持x和y对应的值的数量相同
width = 0.1 # 设置柱状图的宽度
x1 = [1.1,2,3.1,4.6,5] # 5个值
# x2 = [0.85] # 1个值
y1 = [0,1,2,3,4] # 也要5个值
# y2 = [0] # 也要1个值
y_labels = ['xxx','xxx','xxx','xxx','xxx'] # 5个标签对应5个值
idx = np.arange(len(x1))
# idx = np.arange(len(x2))

第三步,画图

# 可设置的参数很多,width,height,align,facecolor,edgecolor,alpha,label,zorder
# 通常align设置为center不用去调idx值对齐;alpha可以调透明度,越小越透明;zorder表示层级
# zorder=2的图像覆盖到zorder=1之上
plt.barh(
        idx,x1,
        width,
        facecolor = 'blue',
        edgecolor = 'white',
        alpha = 0.3,
        zorder = 1,
        label = 'xxx')

第四步,设置辅助显示层的一些参数

  1. title常用参数
    fontsize设置字体大小,默认12,可选参数 [‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’,’x-large’, ‘xx-large’]
    fontweight设置字体粗细,可选参数 [‘light’, ‘normal’, ‘medium’, ‘semibold’, ‘bold’, ‘heavy’, ‘black’]
    fontstyle设置字体类型,可选参数[ ‘normal’ | ‘italic’ | ‘oblique’ ],italic斜体,oblique倾斜
    verticalalignment设置水平对齐方式 ,可选参数 : ‘center’ , ‘top’ , ‘bottom’ ,’baseline’
    horizontalalignment设置垂直对齐方式,可选参数:left,right,center
    rotation(旋转角度)可选参数为:vertical,horizontal 也可以为数字
    alpha透明度,参数值0至1之间
    backgroundcolor标题背景颜色
    bbox给标题增加外框 ,常用参数如下:
    boxstyle方框外形
    facecolor(简写fc)背景颜色
    edgecolor(简写ec)边框线条颜色
    edgewidth边框线条大小
  2. xlabel,ylabel参数
    fontsize:字体大小自调,默认12
    verticalalignment:’top’, ‘bottom’, ‘center’, ‘baseline’
    horizontalalignment:’center’, ‘right’, ‘left’
    rotation: ‘vertical’,’horizontal’,’vertical’
  3. subplots_adjust参数
    如果y轴或x轴刻度标签放不进一个画面里,show图片后可以通过configure subplots按钮进行调整,再把其参数输入到代码中
  4. legend图例参数
    loc参数,
    0: ‘best’
    1: ‘upper right’
    2: ‘upper left’
    3: ‘lower left’
    4: ‘lower right’
    5: ‘right’
    6: ‘center left’
    7: ‘center right’
    8: ‘lower center’
    9: ‘upper center’
    10: ‘center’
    fontsize参数
    fontsize : int or float or {‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, ‘x-large’, ‘xx-large’}
    frameon,edgecolor,facecolor参数
    plt.legend(loc=’best’,frameon=False) #去掉图例边框
    plt.legend(loc=’best’,edgecolor=’blue’) #设置图例边框颜色
    plt.legend(loc=’best’,facecolor=’blue’) #设置图例背景颜色,若无边框,参数无效
plt.title('xxx',fontsize=14,bbox=dict(facecolor='green',edgecolor='blue',alpha=0.6))
plt.xlabel('xxx',fontsize=10)
plt.ylabel('xxx',fontsize=10)
plt.subplots_adjust(left=0.1,right=0.9,top=0.9,bottom=0.2,hspace=0.12,wspace=0.1)
plt.legend(loc='best',fontsize=10)
# 表示不显示坐标轴
plt.axis('off')

第五步,设置一些坐标轴,刻度,刻度标签,矩形的参数

ax = plt.gca() # 获取当前axes
# spines是连接轴刻度标记的线,将其颜色设为none就是去掉该线
ax.spines['bottom'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['left'].set_color('grey')
ax.spines['left'].set_linewidth(1)
# 可以设置为x轴不显示/y轴不显示
ax.axes.get_xaxis().set_visible(False)
# x轴范围
ax.set_xlim(-1, 1.1)
# x轴坐标刻度(可以表示成具体的几个值)
ax.set_xticks([-1, 0, 1])
# x轴刻度标签,方便调大小
ax.set_xticklabels(['-1', '0', '1'], fontsize=10)
# y轴范围
ax.set_ylim(-0.2, len(y1)-0.2)
# y轴坐标刻度(具体表示成几个值,比如说0,1,2,3,4)
ax.set_yticks([0])
# y轴刻度标签赋到坐标刻度上
ax.set_yticklabels(['xxx'],fontsize=10)
# 画矩形框(别忘了在开头导入patches)
# 前两个参数是相对于(0,0)矩形的左下角坐标,0.4是矩形的宽度,0.3是矩形的高度
# 矩形四个点坐标(0.8,-0.15),(1.2,-0.15),(1.2,0.15),(0.8,0.15)
rect = patches.Rectangle((0.8,-0.15),0.4,0.3,linewidth=0.8,edgecolor='black',facecolor='none',zorder=3)
ax.add_patch(rect)

第六步,有些时候需要引入数据标签

前边设置的x1、y1值其实就代表了不同柱子在图形中的位置(坐标),通过for循环找到每一个x1、y1值的相应坐标——a、b,再使用plt.text在对应位置添文字说明来生成相应的数字标签,而for循环也保证了每一个柱子都有标签。
其中,a-0.03, b表示在每一柱子对应x值左侧0.03处、y值标注文字说明 ,ha=’center’, va= ‘bottom’代表horizontalalignment(水平对齐)、verticalalignment(垂直对齐)的方式,fontsize则是文字大小。
数字标签

for a,b in zip(x1,y1):
    plt.text(a-0.03,b,a,ha='right',va='center',fontsize=14)

第七步,网格设置,保存图像,展示图像

# 背景中的网格,False为取消网格,True为显示网格
plt.grid(False)
# savefig一定要在show之前,要不然就是空白图像,路径设置注意要用两个斜杠'\\'
plt.savefig('D:\\test\\graph.png')
# 展示图像
plt.show()

PS:总结一下画子图

如果是分成上下两个规则的子图
plt.subplot(211)
定义图像,辅助显示参数等
plt.subplot(212)
定义图像,辅助显示参数等

如果是不规则划分子图,类似这样的
这里写图片描述
将整个表按照 2*2 划分
前两个简单, 分别是 (2, 2, 1) 和 (2, 2, 2)
但是第三个图呢, 他占用了 (2, 2, 3) 和 (2, 2, 4)
显示需要对其重新划分, 按照 2 * 1 划分
前两个图占用了 (2, 1, 1) 的位置
因此第三个图占用了 (2, 1, 2) 的位置
这里写图片描述

折线图
思路和柱状图差不多
第一步,定义画布
第二步,折线图的值的设置

x = [0,1,2,3,4,5] # 6个值
# 两条折线
y1 = [2.3,2,3,2.3,1.7,3] # 对应也要6个值
y2 = [2,1.7,2.7,2,2,2.3] # 对应也要6个值
x_labels = ['xxx','xxx','xxx','xxx','xxx','xxx']

第三步,画图
折线图用plt.plot直接画
linestyle参数:
-, solid(实线)
–, dashed (虚线)
-., dashdot
:, dotted
”, ’ ‘, None
linewidth参数(设置线条粗细)
marker参数
‘.’: 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

以下关键字参数可以用来设置marker的样式:
marker
markeredgecolor 或 mec
markeredgewidth 或 mew
markerfacecolor 或 mfc
markerfacecoloralt 或 mfcalt
markersize 或 ms

设置空心圆标记的方法:mfc设置为none,mec设置为一个颜色,mew设置的宽一些,比较好看

plt.plot(x,y1,linestyle='-',marker='o',markersize=8,markerfacecolor='none',markeredgecolor='deepskyblue',markeredgewidth=1.5,linewidth =2,color='deepskyblue',label="xxx")
plt.plot(x,y2,linestyle='--',marker='o',markersize=8,markerfacecolor='none',markeredgecolor='darkorange',markeredgewidth=1.5,linewidth =2,color='darkorange',label="xxx")

第四步,设置辅助显示层的一些参数(和柱状图一样)
plt.title
plt.xlabel / pt.ylabel
plt.subplots_adjust
plt.legend

第五步,设置一些坐标轴,刻度,刻度标签,矩形的参数

ax = plt.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_color('none')
ax.spines['bottom'].set_color('black')
ax.spines['bottom'].set_linewidth(2)
ax.set_xlim(-0.5,len(x)-0.5)
ax.set_xticks(x)
ax.set_xticklabels(x_labels,fontsize=7)

PS: 如果想把x轴坐标刻度(0,1,2,3,4)对应成刻度标签(’xxx’,’xxx’,’xxx’,’xxx’,’xxx’)
两种方法:
第一种,
plt.xticks(x,x_labels,fontsize=7)
第二种,
ax = plt.gca()
ax.set_xticks(x)
ax.set_xticklabels(x_labels,fontsize=7)

第六步,数据标签

for a,b in zip(x,y1):
    plt.text(a,b,b,ha='right',va='bottom',fontsize=14)
for a,b in zip(x,y2):
    plt.text(a,b,b,ha='right',va='bottom',fontsize=14)

第七步,网格设置,保存图像,展示图像

plt.grid()
plt.savefig()
plt.show()

猜你喜欢

转载自blog.csdn.net/HARD_FAN/article/details/79991390