Python实现双X轴双Y轴绘图的示例详解
诈尸人口回归。这一年忙着灌水忙到头都掉了,最近在女朋友的提醒下终于想起来博客的账号密码,正好今天灌水的时候需要画一个双X轴双Y轴的图,研究了两小时终于用Py实现了。找资料的过程中没有发现有系统的文章,反正代码都整理出来了,我决定顺势水一篇。
目前找到的plt实现双X轴双Y轴绘图方式有两种:
使用fig.add_subplot
方式将两对坐标系叠加在一个fig上实现双X轴双Y轴效果。所有调整均可完美实现,推荐该方式
通过axes.twinx().twiny()
方式实现双X轴双Y轴图形绘制。问题在于对于第二个Y轴的各种设置无效,label可以通过手动添加的方式创建并指定颜色,而tick颜色则无法修改。可能需要等待官方修复,或者尝试先使用ax1=axes.twinx()
方式,从ax1
中获取第二个Y轴,然后再使用ax2.twiny()
创建第二个X轴。
fig.add_subplot 方式实现双X轴双Y轴绘图
""" 使用plt,通过fig.add_subplot方式将两对坐标系叠加在一个fig上实现双X轴双Y轴效果。 所有调整均可完美实现,推荐该方式 """ import matplotlib.pyplot as plt import numpy as np """生成数据并设置绘图参数""" x = np.arange(1, 12, 4) y = np.arange(1, 4, 1) x2=x*10 y2=y**2 # 设置两种绘图颜色 c1="r" c2="b" # 设置字体大小 fontsize=12 # 设置画布大小 width,height=16,14 # 单位为cm;因为保存图片时使用 bbox_inches = "tight" 可能使图片尺寸略微放大,所以此处宽度设置得略小 # 设置刻度线在坐标轴内 plt.rcParams["xtick.direction"] = "in" plt.rcParams["ytick.direction"] = "in" """绘图""" lns=[] # 用于存储绘图句柄以合并图例的list # 创建画布并设置大小 fig=plt.figure() fig.set_size_inches(width/2.54, height/2.54) # 因为画布输入大小为厘米,此处需转换为英寸,所以除以2.54 # 通过 add_subplot 方式创建两个坐标轴,相当于在同一个子图上叠加了两对坐标系 ax=fig.add_subplot(111, label="1") ax2=fig.add_subplot(111, label="2", frame_on=False) # 绘制图1并将绘图句柄返回,以便添加合并图例 lns1=ax.plot(x,y,color=c1,label=c1) lns=lns1 lns2=ax2.plot(x2,y2, color=c2,label=c2) lns+=lns2 """图形美化""" # 调整第二对坐标轴的label和tick位置,以实现双X轴双Y轴效果 ax2.xaxis.tick_top() ax2.yaxis.tick_right() ax2.xaxis.set_label_position("top") ax2.yaxis.set_label_position("right") # 设置坐标轴标注 ax.set_xlabel("X1", color=c1,fontsize=fontsize) ax.set_ylabel("Y1", color=c1,fontsize=fontsize) ax2.set_xlabel("X2", color=c2,fontsize=fontsize) ax2.set_ylabel("Y2", color=c2,fontsize=fontsize) # 设置图表标题 fig.suptitle("Title",fontsize=fontsize+2) # 设置坐标轴刻度颜色 ax.tick_params(axis="x", colors=c1) ax.tick_params(axis="y", colors=c1) ax2.tick_params(axis="x", colors=c2) ax2.tick_params(axis="y", colors=c2) # 设置坐标轴线颜色 ax.spines["left"].set_color("r") # 修改左侧颜色 ax.spines["right"].set_color("b") # 修改右侧颜色 ax.spines["top"].set_color("b") # 修改上边颜色 ax.spines["bottom"].set_color("r") # 修改下边颜色 # 添加图例 labs = [l.get_label() for l in lns] ax.legend(lns, labs, loc=0,fontsize=fontsize) plt.tight_layout() plt.show()
使用 axes.twinx().twiny() 方式实现双X轴双Y轴绘图
""" 使用plt,通过 axes.twinx().twiny() 方式实现双X轴双Y轴图形绘制。 问题在于对于第二个Y轴的各种设置无效,label可以通过手动添加的方式创建并指定颜色,而tick颜色则无法修改 """ import matplotlib.pyplot as plt import numpy as np """生成数据并设置绘图参数""" x = np.arange(1, 12, 4) y = np.arange(1, 4, 1) x2=x*10 y2=y**2 # 设置两种绘图颜色 c1="r" c2="b" # 设置字体大小 fontsize=12 # 设置刻度线在坐标轴内 plt.rcParams["xtick.direction"] = "in" plt.rcParams["ytick.direction"] = "in" """绘图""" lns=[] # 用于存储绘图句柄以合并图例的list # 创建画布 fig,axes=plt.subplots() fig.set_size_inches(10, 8) # 绘制图1并将绘图句柄返回,以便添加合并图例 lns1=axes.plot(x,y,color=c1,label=c1) lns=lns1 # 创建双x轴双y轴 twin_axes=axes.twinx().twiny() # 使用画布的初始坐标轴对象创建第二对坐标轴,类似于在双x轴的基础上叠加双y轴 # 绘制图2并将绘图句柄返回,以便添加合并图例 lns2=twin_axes.plot(x2,y2,color=c2,label=c2) lns+=lns2 """图形美化""" # 设置坐标轴标注 axes.set_xlabel("X1",color=c1, fontsize=fontsize) axes.set_ylabel("Y1",color=c1, fontsize=fontsize) twin_axes.set_xlabel("X2",color=c2, fontsize=fontsize) twin_axes.set_ylabel("Y2",color=c2, fontsize=fontsize) # 第二个y轴设置标注无效 # 设置图表标题 fig.suptitle("Title",fontsize=fontsize+2) # 设置第二个y轴的label;由于set_ylabel无效,因此只能通过该种方式手动添加 loc_text_x=np.min(plt.xlim())+np.ptp(plt.xlim())*1.03 loc_text_y=np.min(plt.ylim())+np.ptp(plt.ylim())*0.5 str_text="Y2" twin_axes.text(loc_text_x, loc_text_y, str_text,rotation=90,color=c2,fontsize=fontsize) # 设置坐标轴刻度颜色 axes.tick_params("x", colors=c1) axes.tick_params("y", colors=c1) twin_axes.tick_params("x", colors=c2) twin_axes.tick_params("y", colors=c2) # 设置坐标轴线颜色 twin_axes.spines["left"].set_color("r") # 修改左侧颜色 twin_axes.spines["right"].set_color("b") # 修改右侧颜色;同第二个y轴的label设置一样,该设置也不起作用 twin_axes.spines["top"].set_color("b") # 修改上边颜色 twin_axes.spines["bottom"].set_color("r") # 修改下边颜色 # 添加图例 # lns = lns1+lns2 labs = [l.get_label() for l in lns] axes.legend(lns, labs, loc=0,fontsize=fontsize) plt.tight_layout() plt.show()
到此这篇关于Python实现双X轴双Y轴绘图的示例详解的文章就介绍到这了,更多相关Python双轴绘图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
下一篇:python循环语句的使用方法
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?