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

双y轴坐标轴图

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


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

横坐标设置时间间隔


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

纵坐标设置显示百分比


  1. import matplotlib.ticker as mtick 
  2.  
  3. fmt='%.2f%%' 
  4.  
  5. yticks = mtick.FormatStrFormatter(fmt) 
  6.  
  7. ax2.yaxis.set_major_formatter(yticks) 

知识点

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

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

一个Figure对应一张图片。

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

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

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

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

 add_subplot()

  • 官网matplotlib.pyplot.figure
    pyplot.figure()是返回一个Figure对象的,也就是一张图片。
  • add_subplot(args, *kwargs)

The Axes instance will be returned.

twinx()

  • matplotlib.axes.Axes method2 

  1. 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_major_formatter(formatter)

Set the formatter of the major ticker

ACCEPTS: A Formatter instance

DateFormatter()

  • class matplotlib.dates.DateFormatter(fmt, tz=None)
    这是一个类,创建一个时间格式的实例。

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


  1. strftime(dt, fmt=None) 
  2.  
  3. Refer to documentation for datetime.strftime. 
  4.  
  5. fmt is a strftime() format string. 

FormatStrFormatter()

  • class matplotlib.ticker.FormatStrFormatter(fmt)

Use a new-style format string (as used by str.format()) to format the tick. The field formatting must be labeled x

定义字符串格式。

plt.xticks

  • matplotlib.pyplot.xticks(args, *kwargs)

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

代码汇总


  1. #coding:utf-8 
  2.  
  3. import matplotlib.pyplot as plt 
  4.  
  5. import matplotlib as mpl 
  6.  
  7. import matplotlib.dates as mdate 
  8.  
  9. import matplotlib.ticker as mtick 
  10.  
  11. import numpy as np 
  12.  
  13. import pandas as pd 
  14.  
  15. import os 
  16.  
  17. mpl.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 
  18.  
  19. mpl.rcParams['axes.unicode_minus']=False #用来正常显示负号 
  20.  
  21. mpl.rc('xtick', labelsize=20) #设置坐标轴刻度显示大小 
  22.  
  23. mpl.rc('ytick', labelsize=20) 
  24.  
  25. font_size=30 
  26.  
  27. #matplotlib.rcParams.update({'font.size': 60}) 
  28.  
  29. %matplotlib inline 
  30.  
  31. plt.style.use('ggplot'
  32.  
  33. data=pd.read_csv('simsendLogConvert_20160803094801.csv',index_col=0,encoding='gb2312',parse_dates=True
  34.  
  35. columns_len=len(data.columns) 
  36.  
  37. data_columns=data.columns 
  38.  
  39. for x in range(0,columns_len,2): 
  40.  
  41. print('第{}列'.format(x)) 
  42.  
  43. total=data.ix[:,x] 
  44.  
  45. print('第{}列'.format(x+1)) 
  46.  
  47. successRate=(data.ix[:,x+1]/data.ix[:,x]).fillna(0) 
  48.  
  49. yLeftLabel=data_columns[x] 
  50.  
  51. yRightLable=data_columns[x+1] 
  52.  
  53. print('------------------开始绘制类型{}曲线图------------------'.format(data_columns[x])) 
  54.  
  55. fig=plt.figure(figsize=(25,20)) 
  56.  
  57. ax1=fig.add_subplot(111) 
  58.  
  59. #绘制Total曲线图 
  60.  
  61. ax1.plot(total,color='#4A7EBB',label=yLeftLabel,linewidth=4) 
  62.  
  63. # 设置X轴的坐标刻度线显示间隔 
  64.  
  65. ax1.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d %H:%M:%S'))#设置时间标签显示格式 
  66.  
  67. plt.xticks(pd.date_range(data.index[0],data.index[-1],freq='1min'))#时间间隔 
  68.  
  69. plt.xticks(rotation=90) 
  70.  
  71. #设置双坐标轴,右侧Y轴 
  72.  
  73. ax2=ax1.twinx() 
  74.  
  75. #设置右侧Y轴显示百分数 
  76.  
  77. fmt='%.2f%%' 
  78.  
  79. yticks = mtick.FormatStrFormatter(fmt) 
  80.  
  81. # 绘制成功率图像 
  82.  
  83. ax2.set_ylim(0,110) 
  84.  
  85. ax2.plot(successRate*100,color='#BE4B48',label=yRightLable,linewidth=4) 
  86.  
  87. ax2.yaxis.set_major_formatter(yticks) 
  88.  
  89. ax1.set_xlabel('Time',fontsize=font_size) 
  90.  
  91. ax1.set_ylabel(yLeftLabel,fontsize=font_size) 
  92.  
  93. ax2.set_ylabel(yRightLable,fontsize=font_size) 
  94.  
  95. legend1=ax1.legend(loc=(.02,.94),fontsize=16,shadow=True
  96.  
  97. legend2=ax2.legend(loc=(.02,.9),fontsize=16,shadow=True
  98.  
  99. legend1.get_frame().set_facecolor('#FFFFFF'
  100.  
  101. legend2.get_frame().set_facecolor('#FFFFFF'
  102.  
  103. plt.title(yLeftLabel+'&'+yRightLable,fontsize=font_size) 
  104.  
  105. plt.savefig('D:\\JGT\\Work-YL\\01布置的任务\\04绘制曲线图和报告文件\\0803\\出图\\{}-{}'.format(yLeftLabel.replace(r'/',' '),yRightLable.replace(r'/',' ')),dpi=300)  

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



作者:Michael_翔_

来源:51CTO

上一篇:互联网巨头的云战略:云计算,还是云服务?


下一篇:.NET简谈互操作(四:基础知识之Dispose非托管内存)