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

开发 开发工具
今天利用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对象都是一个拥有自己坐标系统的绘图区域。其逻辑关系如下: 

 一个Figure对应一张图片。

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

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

 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)  

参考

 

  1. Vami-绘图: matplotlib核心剖析 
  2. Secondary axis with twinx(): how to add to legend? 

 

 

责任编辑:庞桂玉 来源: segmentfault
相关推荐

2015-07-29 10:25:05

数据开发产品必修课

2013-07-29 04:57:47

iOS开发iOS开发学习时间设置和格式输出

2009-12-22 09:04:35

ACL时间控制列表

2022-07-25 14:17:04

JS应用开发

2023-04-07 08:02:30

图形编辑器对齐功能

2017-04-06 15:49:18

机器人控制方式特点

2009-12-24 17:41:12

ADO Connect

2011-01-19 14:32:17

Thunderbird设置

2013-04-01 14:40:34

App内购家长苹果

2010-09-29 16:51:10

访问控制

2010-07-26 09:57:21

telnet pop

2011-07-27 14:48:21

iPhone Cocos2D 坐标

2019-03-24 19:16:35

FedoraSSH系统运维

2013-05-30 09:58:50

RouterosADSL负载均衡技术

2009-12-03 15:24:39

双wan路由器设置

2012-02-02 10:23:41

2012-10-11 15:28:18

设置默认打印机

2009-06-12 18:50:34

JBoss控制台密码设

2010-04-14 17:11:13

Oracle管理

2012-12-17 09:50:40

路由器访问路由器设置路由器控制
点赞
收藏

51CTO技术栈公众号