• Matplotlib绘图双纵坐标轴设置及控制设置时间格式


    双y轴坐标轴图

    今天利用matplotlib绘图,想要完成一个双坐标格式的图。

    fig=plt.figure(figsize=(20,15))
    ax1=fig.add_subplot(111)
    ax1.plot(demo0719['TPS'],'b-',label='TPS',linewidth=2)
    ax2=ax1.twinx()#这是双坐标关键一步
    ax2.plot(demo0719['successRate']*100,'r-',label='successRate',linewidth=2)

    横坐标设置时间间隔

    import matplotlib.dates as mdate
    ax1.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d %H:%M:%S'))#设置时间标签显示格式
    plt.xticks(pd.date_range(demo0719.index[0],demo0719.index[-1],freq='1min'))

    纵坐标设置显示百分比

    import matplotlib.ticker as mtick
    fmt='%.2f%%'
    yticks = mtick.FormatStrFormatter(fmt)
    ax2.yaxis.set_major_formatter(yticks)

    知识点

    在matplotlib中,整个图像为一个Figure对象。在Figure对象中可以包含一个,或者多个Axes对象。每个Axes对象都是一个拥有自己坐标系统的绘图区域。其逻辑关系如下:


    一个Figure对应一张图片。

    Title为标题。Axis为坐标轴,Label为坐标轴标注。Tick为刻度线,Tick Label为刻度注释。

    Title为标题。Axis为坐标轴,Label为坐标轴标注。Tick为刻度线,Tick Label为刻度注释。

    add_subplot()

    The Axes instance will be returned.

    twinx()

    ax = twinx()

    create a twin of Axes for generating a plot with a sharex x-axis but independent y axis. The y-axis of self will have ticks on left and the returned axes will have ticks on the right.
    意思就是,创建了一个独立的Y轴,共享了X轴。双坐标轴!

    类似的还有twiny()

    ax1.xaxis.set_major_formatter

    Set the formatter of the major ticker
    ACCEPTS: A Formatter instance

    DateFormatter()

    strftime方法(传入格式化字符串)。

    strftime(dt, fmt=None)
    Refer to documentation for datetime.strftime.
    fmt is a strftime() format string.

    FormatStrFormatter()

    Use a new-style format string (as used by str.format()) to format the tick. The field formatting must be labeled x
    定义字符串格式。

    plt.xticks

    # return locs, labels where locs is an array of tick locations and
    # labels is an array of tick labels.
    locs, labels = xticks()
    
    # set the locations of the xticks
    xticks( arange(6) )
    
    # set the locations and labels of the xticks
    xticks( arange(5), ('Tom', 'Dick', 'Harry', 'Sally', 'Sue') )

    代码汇总

    #coding:utf-8
    import matplotlib.pyplot as plt 
    import matplotlib as mpl
    import matplotlib.dates as mdate
    import matplotlib.ticker as mtick
    import numpy as np
    import pandas as pd
    import os
    
    
    mpl.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
    mpl.rcParams['axes.unicode_minus']=False #用来正常显示负号
    mpl.rc('xtick', labelsize=20) #设置坐标轴刻度显示大小
    mpl.rc('ytick', labelsize=20) 
    font_size=30
    #matplotlib.rcParams.update({'font.size': 60})
    
    %matplotlib inline
    plt.style.use('ggplot')
    
    data=pd.read_csv('simsendLogConvert_20160803094801.csv',index_col=0,encoding='gb2312',parse_dates=True)
    
    columns_len=len(data.columns)
    data_columns=data.columns
    
    for x in range(0,columns_len,2):
        print('第{}列'.format(x))
        total=data.ix[:,x]
        print('第{}列'.format(x+1))
        successRate=(data.ix[:,x+1]/data.ix[:,x]).fillna(0)
        
        
        yLeftLabel=data_columns[x]
        yRightLable=data_columns[x+1]
        
        
        print('------------------开始绘制类型{}曲线图------------------'.format(data_columns[x]))
        
        fig=plt.figure(figsize=(25,20))
        ax1=fig.add_subplot(111)
        #绘制Total曲线图
        ax1.plot(total,color='#4A7EBB',label=yLeftLabel,linewidth=4)
    
        # 设置X轴的坐标刻度线显示间隔
        ax1.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d %H:%M:%S'))#设置时间标签显示格式
        plt.xticks(pd.date_range(data.index[0],data.index[-1],freq='1min'))#时间间隔
        plt.xticks(rotation=90)
        
        #设置双坐标轴,右侧Y轴
        ax2=ax1.twinx()
        
        #设置右侧Y轴显示百分数
        fmt='%.2f%%'
        yticks = mtick.FormatStrFormatter(fmt)
        
        # 绘制成功率图像
        ax2.set_ylim(0,110)
        ax2.plot(successRate*100,color='#BE4B48',label=yRightLable,linewidth=4)
        ax2.yaxis.set_major_formatter(yticks)
    
        ax1.set_xlabel('Time',fontsize=font_size) 
        ax1.set_ylabel(yLeftLabel,fontsize=font_size)
        ax2.set_ylabel(yRightLable,fontsize=font_size)
        
        legend1=ax1.legend(loc=(.02,.94),fontsize=16,shadow=True)
        legend2=ax2.legend(loc=(.02,.9),fontsize=16,shadow=True)
        
        legend1.get_frame().set_facecolor('#FFFFFF')
        legend2.get_frame().set_facecolor('#FFFFFF')
        
        plt.title(yLeftLabel+'&'+yRightLable,fontsize=font_size)
    
        plt.savefig('D:\JGT\Work-YL\01布置的任务\04绘制曲线图和报告文件\0803\出图\{}-{}'.format(yLeftLabel.replace(r'/',' '),yRightLable.replace(r'/',' ')),dpi=300)
    

    参考


    1. Vami-绘图: matplotlib核心剖析
    2. Secondary axis with twinx(): how to add to legend?
  • 相关阅读:
    SQL server中自定义排序
    安装nodejs版本模块报错notsup Unsupported platform for n
    vue项目中一些标签直接放在<template>下会报错Failed to compile with 1 errors
    vue中使用element-ui出现Couldn't find preset "es2015" relative to directory
    解决两个相邻的span,或者input和button中间有间隙,在css中还看不到
    VsCode中代码折叠快捷键
    npm 操作代码
    vue项目打包成html,在本地点击直接能打开
    地图只显示部分区域,其他地区不显示
    vs里颜色显示块怎样显示
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/8547926.html
Copyright © 2020-2023  润新知