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?
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在matplotlib设置双纵坐标轴,可以使用twinx()函数创建第二个y。首先,创建一个包含两个子图的图形(fig)和(ax1和ax2)。在第一个(ax1)上使用bar()函数绘制柱状图,设置颜色为蓝色,透明度为0.5,并设置x标签和y标签。然后,使用twinx()函数创建第二个(ax2),并使用plot()函数在其上绘制线条图,设置颜色为红色,并设置y标签。最后,使用fig.legend()函数添加图例,并使用plt.show()函数显示图形。以下是一个示例代码: import matplotlib.pyplot as plt import numpy as np X = ["2019-01", "2019-02", "2019-03", "2019-04", "2019-05", "2019-06", "2019-07", "2019-08", "2019-09", "2019-10", "2019-11", "2019-12"] Y1 = np.random.randint(500, 1000, 12) Y2 = [None] for i in range(1, len(Y1)): Y2.append((Y1[i - Y1[i-1]) / Y1[i-1]) fig, ax1 = plt.subplots() plt.xticks(rotation=45) ax1.bar(X, Y1, color="blue", alpha=0.5, label="出货量") ax1.set_xlabel("月份") ax1.set_ylabel("出货量(吨)") ax2 = ax1.twinx() ax2.plot(X, Y2, color="red", label="环比增长") ax2.set_ylabel("环比增长") fig.legend(loc="upper right", bbox_to_anchor=(1, 1), bbox_transform=ax1.transAxes) plt.show() 这段代码可以创建一个带有双纵坐标轴的图形,其中第一个(ax1)绘制了柱状图,表示出货量,第二个(ax2)绘制了线条图,表示环比增长。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Matplotlib绘图双纵坐标轴设置控制设置时间格式](https://blog.csdn.net/weixin_39716971/article/details/110768926)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [matplotlib绘制双坐标轴双纵)](https://blog.csdn.net/lanhezhong/article/details/108061483)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值