python绘图-matplotlib应用笔记

figure/axis/axes/plt分别表示什么?

在这里插入图片描述

matplot绘图的基础就是由上述图片中的元素所构成,我把他们理解为元素或者模块。画图就是一个一个小的元素组合在一起的结果。

plt

导入的matplotlib库的api使者,所有后续的操作都是从这个使者引入进来的。

Figure:可以解释为画布。
  • 也就是一切元素堆砌的基础。画图的第一步就是创建画布。

figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)

  • num:图像编号或名称,数字为编号 ,字符串为名称
  • figsize:指定figure的宽和高,单位为英寸;
  • dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 1英寸等于2.5cm,A4纸是 21*30cm的纸张
  • facecolor:背景颜色
  • edgecolor:边框颜色
  • frameon:是否显示边框
import matplotlib.pyplot as plt
创建自定义图像
fig=plt.figure(figsize=(4,3),facecolor='blue')
plt.show()
Axes 是图像中具有数据空间的区域

可以直接理解为对象、元素。 一个figure中可以包含多个 Axes,但一个给定的 Axes 对象只能在一个图形中。 Axes 包含两个(或在 3D 的情况下为三个)Axis 对象(注意 Axes 和 Axis 之间的区别),它们负责数据限制(数据限制也可以通过 set_xlim() 和 set_ylim 进行设置 () 轴方法)。 每个轴都有一个标题(通过 set_title() 设置)、一个 x 标签(通过 set_xlabel() 设置)和一个通过 set_ylabel() 设置的 y 标签。如果你的figure有subplot,那么每一个subplot就是一个axes。

Axis 坐标轴

每个坐标轴实际上也是由竖线和数字组成的,每一个竖线其实也是一个axis的subplot,因此ax.xaxis也存在axes这个对象。对这个axes进行编辑就会修改xaxis图像上的表现。

总结

1、Figure:画布,Axes的容器
2、Axes:图像有效区域。包含坐标轴以及图像
3、Axis:坐标轴
4、画图的时候plt函数或者axes面向对象绘图都可以。

图像元素说明

在这里插入图片描述

  • xlim,ylim指定坐标轴的取值范围,
  • title指定图的名称,
  • xlabel,ylabel设置坐标轴名字及其字体大小,支持Latex语法。
  • yscale对坐标轴刻度值的函数,有log等选项。
  • minorticks_on打开最小刻度线,
  • tick_params(which=‘minor’,direction=‘in’,width=2,length=4)控制主次刻度线的长度,宽度和朝向,
  • (top=‘off’,bottom=‘on’,left=‘on’,right=‘off’)设置主刻度线在上下左右四条边上是否显示,
  • tick_params(labeltop=‘off’,labelbottom=‘on’,labelleft=‘on’,labelright=‘off’)设置刻度值(ticklabel)在上下左右四条边上是否显示。
  • xtick([])关闭x轴坐标刻度,yticks([…1],[…2])设置刻度值名称,支持Latex语法。
  • axis(‘off’)关闭坐标轴显示。
  • grid打开网格线,ax.xaxis.grid()打开x轴的网格线,并设置格式。alpha是透明度,值越大透明度越,越不透明。
  • ax.axes.get_yaxis().set_visible(False)设置坐标轴是上的刻度不可见,但轴仍在。
  • ax.xaxis.set_ticks_position(‘top’)设置x轴的刻度是位于哪一条边上,一般选top或者bottom,ax.spines设置上下左右四条边的颜色、线型、位置等,a
  • x.xaxis.set_major_locator等,设置坐标轴主次刻度值的分辨率
  • tick.label1.set_fontsize(15)设置刻度值字体大小。

调整子图之间的相对位置

plt.subplots_adjust(top=0.92, bottom=0.12, left=0.12, right=0.95, hspace=0.25,wspace=0.35)
中文解决问题

程序中引入

plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False

如果引入以后运行还是出现问题,那就需要下载这个文件的tff文件。并放在指定目录下

yourpath\site-packages\matplotlib\mpl-data\fout\

绘图实例
#!/usr/bin/env python
# coding:utf-8

from email import header
import imp
from re import X
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from datahandler.dataprovider import DataProvider
from datahandler.gtifwriter import GTifWriter
from matplotlib.pyplot import MultipleLocator, title
from matplotlib import font_manager
import os
import datetime
# 用来显示中文标签
zhfont1 = font_manager.FontProperties(fname=os.path.join(os.path.dirname(os.path.abspath(__file__)),'font/simhei.ttf'))

plt.rcParams['font.sans-serif'] = ['SimHei']
# 用来显示负号
plt.rcParams['axes.unicode_minus'] = False
# 调整生成的图表最大尺寸
plt.rcParams['figure.figsize'] = (15.0, 12.0)
plt.rcParams['figure.dpi'] = 100
plt.rc('font',family='Times New Roman')
subFontsize = 18
subTitleFontsize = 26
def draw(time,exceldata,hdfdata,title,outfile):
    #front是标签属性:包括字体、大小等
    font = {'family' : 'Times New Roman',
    'weight' : 'normal',
    'size'   : 18,
    }
    
    x = time[:-1]
    fig,ax=plt.subplots(1,2) # 绘制横向两个图

    plt.suptitle(title,
            fontproperties=zhfont1,
            fontsize=subTitleFontsize)# 设置主标题
    for i,key in enumerate(exceldata.keys()):
        y1 = exceldata[key][:-1]
        y2 = hdfdata[:,i]
        plt.subplot(121) # 横向第一个
        plt.plot(x,y1,linewidth=0.5, color="red",label="{} csv value".format(key))
        plt.subplot(122) #横向第二个
        plt.plot(x,y2,linewidth=0.5, color="blue",label="{} hdf value".format(key))

        print(key)

    x_major_locator=MultipleLocator(25)#横坐标以每25显示
    y_major_locator=MultipleLocator(100)#纵坐标以每100显示

    subtitle = ['CSV文件','HDF文件']
    for i in range(len(ax)):
       ’‘’
       给每一个子图添加坐标轴和标题
       ‘’‘
        plt.subplot(1,2,i+1) # 编辑第i+1个图
        ax[i].xaxis.set_major_locator(x_major_locator) # 等间距坐标标注
        ax[i].yaxis.set_major_locator(y_major_locator)
        ax[i].set_xlabel("UTC时间", fontsize=subFontsize,fontproperties=zhfont1) #设置坐标轴,中文显示
        ax[i].set_ylabel("Value", fontsize=subFontsize,fontdict=font)
        plt.title(subtitle[i],
            fontproperties=zhfont1,
            fontsize=subTitleFontsize)
        plt.xticks(rotation = 45) # X坐标轴标注角度偏移
        plt.legend(
            loc = 'upper right',
            prop = {'size':12},
            ncol = 2 ) # ncol 表示图例的列数
        plt.xticks(fontsize = subFontsize)
        plt.yticks(fontsize = subFontsize)
    plt.tight_layout() # 自动调整图片的大小以适应于画布
    plt.savefig(outfile)

结果展示:
在这里插入图片描述

图像坐标轴调整

实验例子需求说明
该图示要求横坐标时间跨度为3天,实时更新数据,纵坐标轴要求表示为科学计数法,并标注横向分割线和纵向边界线。

def draw(x,hdfdata,subtitles,outfile,title,legend,colors,stime = '',etime = '',ymin=10**-4, ymax=10**1,threshold=10**3,yaxis='count/cm**2*KeV*s*sr'):
    #front是标签属性:包括字体、大小等
    font = {'family' : 'Times New Roman',
    'weight' : 'normal',
    'size'   : 14,
    }
    fig, ax = plt.subplots()
    plt.title(title, fontsize='36', fontweight='heavy', pad=42,fontproperties=zhfont1)
    ax.text(1,
                1,
                subtitles[0],
                horizontalalignment='right',
                verticalalignment='bottom',
                transform=ax.transAxes,
                fontproperties=zhfont1,
                fontsize=subTitleFontsize)

    ax.text(0.5,
            1,
            subtitles[1],
            horizontalalignment='center',
            verticalalignment='bottom',
            transform=ax.transAxes,
            fontproperties=zhfont1,
            fontsize=subTitleFontsize)
    ax.text(0,
            1,
            subtitles[2],
            horizontalalignment='left',
            verticalalignment='bottom',
            transform=ax.transAxes,
            fontproperties=zhfont1,
            fontsize=subTitleFontsize)

    x = pd.to_datetime(x) # 将字符串转为时间格式
    for i in range((hdfdata.shape[1])):
        
        y2 = hdfdata[:,i]
        ax.semilogy(x,y2,linewidth=1, color=colors[i],label="{}".format(legend[i])) # 纵坐标轴为10的N次幂
    # 设置完整的一整天或者三天的时间刻度,指定横轴时间跨度
    lims=[np.datetime64(stime), np.datetime64(etime)]
    ax.set_xlim(lims)
    ax.xaxis.set_major_locator(MultipleLocator(0.25))  # 设置x轴标签间隔
    ax.set_xlabel("UTC时间", fontsize=subFontsize,fontproperties=zhfont1)
    ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d %H:%M'))#设置时间标签显示格式
    ax.set_ylabel(yaxis, fontsize=subFontsize,fontdict=font)
    #以10的幂次方进行表示
    ax.set_ylim(ymin, ymax)
    ax.set_yscale('log')
    ax.tick_params(which='minor',length=0) # 设置刻度
    plt.legend(
        loc = 'upper right',
        prop = {'size':12},
        ncol = 2)
    plt.xticks(fontsize = subTitleFontsize)
    plt.yticks(fontsize = subTitleFontsize)
    
    plt.axhline(y=threshold, color='r', linestyle='dashdot',linewidth=1) # 绘制水平线 此处为y=10
    plt.tight_layout()
    print('=========================')
    plt.savefig(outfile)
    plt.close()

在这里插入图片描述

参考文章

plt与Axes绘图对比
边框线及坐标轴的设置
绘图布局
官方案例
官方API

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值