使用python将作图并将局部放大

news2024/10/7 19:20:52

此程序主要特点:

1、使用python画实验结果图

2、想要对大图的局部进行放大

3、有两个子图

4、子图和原图的横坐标都使用标签而不是原始的数据

代码和注释如下:


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import openpyxl as xl
from mpl_toolkits.axes_grid1.inset_locator import mark_inset

excel_file  = xl.load_workbook('D:\Hnu\Project5 CP\实验结果\\baseline选择.xlsx')
sheet_name = 'Scalability'  #对应的sheet的名称
sheet = excel_file[sheet_name] # 定位excel中具体的表单
data = pd.DataFrame(sheet.values)# 提取表单中的具体数据所在的行和列
selected_data = data.iloc[23:28,1:11]
print(selected_data)
fig, ax = plt.subplots(figsize=(9, 8))#用来控制图片的大小
#设定图片中文字和标签大小的参数
fontsize = 12

# 绘制柱状图,正常坐标,第一个参数是横坐标
# 第二参数,是纵坐标数据,注意11,12,13是列名,是从excel读来的绝对列名,不是selected_data的相对列数
ax.plot(selected_data.iloc[:,0], selected_data[2],marker='o', label='order=4,dim=100')
ax.plot(selected_data.iloc[:,0], selected_data[3],marker='v', label='order=4,dim=1000')
ax.plot(selected_data.iloc[:,0], selected_data[4],marker='d',label='order=3,dim=1000')
ax.plot(selected_data.iloc[:,0], selected_data[5],marker='*',label='order=5,dim=100')
ax.plot(selected_data.iloc[:,0], selected_data[6],marker='s',label='order=5,dim=1000')
ax.plot(selected_data.iloc[:,0], selected_data[7],marker='^',label='order=6,dim=100')
ax.plot(selected_data.iloc[:,0], selected_data[8],marker='h',label='order=6,dim=1000')
ax.plot(selected_data.iloc[:,0], selected_data[9],marker='x',label='order=7,dim=100')
ax.plot(selected_data.iloc[:,0], selected_data[10],marker='+',label='order=7,dim=1000')
#ax.plot(selected_data.iloc[:,1], selected_data[4],color='blue',marker='p',label='GTA')
#ax.plot(selected_data.iloc[:,0], selected_data[5],color='red',marker='*',label='CL_tucker')

#ax.set_yscale('log', basey=10)#设置柱子的纵坐标为对数刻度
#ax.set_yscale('log')#设置柱子的纵坐标为对数刻度

#plt.text(6+1.2,selected_data.iloc[4,5]-0.2, 'A ({:.1f}X)'.format(selected_data.iloc[4,5]), fontsize = 12,ha = 'center')
#plt.text(6+0.3,selected_data.iloc[4,2]+0.4, 'B({:.1f}X)'.format(selected_data.iloc[4,2]), fontsize = 12,ha = 'center')
#plt.text(3,selected_data.iloc[2,1]+0.5, '{:.1f}x'.format(selected_data.iloc[2,3]/selected_data.iloc[2,1]), fontsize = 7,ha = 'center')
#plt.text(4-0.1,selected_data.iloc[3,1]+2, '{:.1f}x'.format(selected_data.iloc[3,3]/selected_data.iloc[3,1]), fontsize = 7,ha = 'center')
#plt.text(5-0.1,selected_data.iloc[4,1]+10, '{:.1f}x'.format(selected_data.iloc[4,3]/selected_data.iloc[4,1]), fontsize = 7,ha = 'center')

# 设置图表标题和轴标题
#plt.title('N = 4 , I_n = 1000')
#plt.title('Enron',fontsize = 12)
plt.xlabel('The number of nonzeros of the input tensor',fontsize=12)
plt.ylabel('Fit',fontsize=12)

# 设置图例
plt.legend(loc='best', ncol=1,fontsize=12)#设置图例的位置和列数

#横坐标为作图数据的时候,设置横纵坐标的显示范围,和刻度间隔
#ax.set_xlim([0.08, 10.5]) #设置坐标显示范围
#xtick_interval = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]#设置刻度间隔
#ax.set_xticks(ticks=xtick_interval)
#ax.set_ylim([0.5, 1.4]) #设置坐标显示范围

#横坐标的刻度不显示作图所用的数据的时候,可以配合plt.xticks显示此处设置的标签
labels = ['1K','10K','100K','1M','10M']
positions = selected_data.iloc[:,0].tolist()
plt.xticks(positions , labels,fontsize = fontsize)  #使得标签现实的是给定的文字标签

#plt.xticks(x, fontsize=12, rotation=45,loc='inside')#设置标签的文字大小和旋转方向
plt.yticks(fontsize= fontsize)


#以下代码是为了绘制局部放大图
#第一步,嵌入绘制局部放大图的坐标系
axins = ax.inset_axes((0.08, 0.05, 0.25, 0.25))
#上述代码的含义是:以父坐标系中的x0=0.2x,y0=0.2y为左下角起点,嵌入一个宽度为0.4x,高度为0.3y的子坐标系,其中x和y分别为父坐标系的坐标轴范围。
axins.plot(selected_data.iloc[:,0], selected_data[2],marker='o', label='order=4,dim=100')
axins.plot(selected_data.iloc[:,0], selected_data[3],marker='v', label='order=4,dim=1000')
axins.plot(selected_data.iloc[:,0], selected_data[4],marker='d',label='order=3,dim=1000')
axins.plot(selected_data.iloc[:,0], selected_data[5],marker='*',label='order=5,dim=100')
axins.plot(selected_data.iloc[:,0], selected_data[6],marker='s',label='order=5,dim=1000')
axins.plot(selected_data.iloc[:,0], selected_data[7],marker='^',label='order=6,dim=100')
axins.plot(selected_data.iloc[:,0], selected_data[8],marker='h',label='order=6,dim=1000')
axins.plot(selected_data.iloc[:,0], selected_data[9],marker='x',label='order=7,dim=100')
axins.plot(selected_data.iloc[:,0], selected_data[10],marker='+',label='order=7,dim=1000')
#设置局部放大后的显示范围
x_ratio = 0.3  # x轴显示范围的扩展比例
y_ratio = 0.6  # y轴显示范围的扩展比例
#设置x轴的显示范围
xlim0 = selected_data.iloc[:,0][25] - 0.2
xlim1 = selected_data.iloc[:,0][25] + 0.2
#这里的25来源于我们从excel种读取数据后,python人认为我们读取的是1到11列,23到28行
#而25行就是我们图中的横坐标方向上的第三个数据值(1K,10K,100K),就是我们想要放大的数据的横坐标的坐标值
#设置Y轴的显示范围
y = np.hstack((selected_data.iloc[2,1],selected_data.iloc[2,4],selected_data.iloc[2,6],selected_data.iloc[2,8]))
#我们想要放大的四个数据(原始数据的纵坐标值)的组成一个数组,找出其中最大的和最小的,进行纵坐标范围的确定
ylim0 = np.min(y) - (np.max(y) - np.min(y)) * y_ratio
ylim1 = np.max(y) + (np.max(y) - np.min(y)) * y_ratio
# 调整子坐标系的显示范围
axins.set_xlim(xlim0, xlim1)
axins.set_ylim(ylim0, ylim1)
# 建立父坐标系与子坐标系的连接线
# loc1 loc2: 坐标系的四个角
# 1 (右上) 2 (左上) 3(左下) 4(右下)
mark_inset(ax, axins, loc1=4, loc2=1, fc="none", ec='gray', lw=1.5,linestyle='--')

axins_labels = ['10K','100K','1M']#设置刻度标签,不设置默认显示的是(xlim0, xlim1)之间的数字
axins.set_xticks([xlim0,(xlim0+xlim1)/2,xlim1])  # 设置刻度位置
axins.set_xticklabels(axins_labels)  # 在对应的刻度位置上打上对应的标签

#画第二个子图
axins1 = ax.inset_axes((0.77, 0.2, 0.2, 0.38))
#上述代码的含义是:以父坐标系中的x0=0.2x,y0=0.2y为左下角起点,嵌入一个宽度为0.4x,高度为0.3y的子坐标系,其中x和y分别为父坐标系的坐标轴范围。
axins1.plot(selected_data.iloc[:,0], selected_data[2],marker='o', label='order=4,dim=100')
axins1.plot(selected_data.iloc[:,0], selected_data[3],marker='v', label='order=4,dim=1000')
axins1.plot(selected_data.iloc[:,0], selected_data[4],marker='d',label='order=3,dim=1000')
axins1.plot(selected_data.iloc[:,0], selected_data[5],marker='*',label='order=5,dim=100')
axins1.plot(selected_data.iloc[:,0], selected_data[6],marker='s',label='order=5,dim=1000')
axins1.plot(selected_data.iloc[:,0], selected_data[7],marker='^',label='order=6,dim=100')
axins1.plot(selected_data.iloc[:,0], selected_data[8],marker='h',label='order=6,dim=1000')
axins1.plot(selected_data.iloc[:,0], selected_data[9],marker='x',label='order=7,dim=100')
axins1.plot(selected_data.iloc[:,0], selected_data[10],marker='+',label='order=7,dim=1000')
#设置局部放大后的显示范围
x_ratio = 0.3  # x轴显示范围的扩展比例
y_ratio = 0.02  # y轴显示范围的扩展比例
#设置x轴的显示范围
xlim00 = selected_data.iloc[:,0][26] - 0.2
xlim10 = selected_data.iloc[:,0][26] + 0.2
#这里的25来源于我们从excel种读取数据后,python人认为我们读取的是1到11列,23到28行
#而25行就是我们图中的横坐标方向上的第四个数据值(1K,10K,100K,1M),就是我们想要放大的数据的横坐标的坐标值
#设置Y轴的显示范围
y1 = np.hstack((selected_data.iloc[3,1],selected_data.iloc[3,2],selected_data.iloc[3,3],selected_data.iloc[3,4],selected_data.iloc[3,5],selected_data.iloc[3,6],selected_data.iloc[3,7],selected_data.iloc[3,8],selected_data.iloc[3,9]))
#我们想要放大的四个数据(原始数据的纵坐标值)的组成一个数组,找出其中最大的和最小的,进行纵坐标范围的确定
ylim00 = np.min(y1) - (np.max(y1) - np.min(y1)) * y_ratio-0.001
ylim10 = np.max(y1) + (np.max(y1) - np.min(y1)) * y_ratio+0.001
# 调整子坐标系的显示范围
axins1.set_xlim(xlim00, xlim10)
axins1.set_ylim(ylim00, ylim10)
# 建立父坐标系与子坐标系的连接线
# loc1 loc2: 坐标系的四个角
# 1 (右上) 2 (左上) 3(左下) 4(右下)
mark_inset(ax, axins1, loc1=2, loc2=4, fc="none", ec='gray', lw=1.5,linestyle='--')

axins1_labels = ['100K','1M','10M']#设置刻度标签,不设置默认显示的是(xlim0, xlim1)之间的数字
axins1.set_xticks([xlim00,(xlim00+xlim10)/2,xlim10])  # 设置刻度位置
axins1.set_xticklabels(axins1_labels)  # 在对应的刻度位置上打上对应的标签



#保存和显示图片,必须先保存,后显示图片
plt.savefig('Scalability_NNZ_Fit.png',dpi=300,bbox_inches='tight')
plt.show()

最终效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1570643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BCLinux-for-Euler配置本地yum源

稍微吐槽一句…… 在这片土地上,国产化软件的大潮正在滚滚而来,虽然都不是真正意义上的国产化,但是至少壳是国产的~~~ 之前使用的Centos7的系统,现在都要求统一换成BCLinux-for-Euler。说实话换了之后不太适应,好多用习…

COCO格式转YOLO格式训练

之前就转换过好几次,每次换设备训练,由于压缩包太大,u盘不够用。每次都要找教程从网上再下载一遍。因此这里记录一下,以免下次重新找教程。 在coco数据集中,coco2017train或coco2017val数据集中标注的目标(类别)位置在…

Spring 详细总结

文章目录 第一章 IOC容器第一节 Spring简介1、一家公司2、Spring旗下的众多项目3、Spring Framework①Spring Framework优良特性②Spring Framework五大功能模块 第二节 IOC容器概念1、普通容器①生活中的普通容器②程序中的普通容器 2、复杂容器①生活中的复杂容器②程序中的复…

传输层 --- UDP

目录 1. 传输层是什么呢? 2. 再谈端口号 2.1. 端口号是什么 2.2. 协议号是什么 2.3. 认识知名端口号 2.4. 端口号的相关问题 2.4.1. 一个进程可以绑定多个端口号吗? 2.4.2. 一个端口号可以被多个进程绑定吗? 2.4.3. 为什么不使用P…

数据结构进阶篇 之 【并归排序】(递归与非递归实现)详细讲解

都说贪小便宜吃大亏,但吃亏是福,那不就是贪小便宜吃大福了吗 一、并归排序 MergeSort 1.基本思想 2.实现原理 3.代码实现 4.归并排序的特性总结 二、非递归并归排序实现 三、完结撒❀ –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀…

如何使用单片机 pwm 控制 mos 管?

目录 选择适合的硬件 连接电路 编写代码 参考示例 程序一 程序二 测试与调试 注意事项 使用单片机(如常见的Arduino、STM32等)通过PWM(脉冲宽度调制)控制MOS管(金属氧化物半导体场效应管)是一种常见…

Java中的集合(二)

一、回顾上期 上一篇讲到在Java中,集合和容器是非常重要的概念,用于存储和操作数据。在集合中,有单列集合和双列集合两种类型。我们在上一篇将单列集合中的list类讲完了,这一篇将会将集合中剩余部分介绍完,话不多说&am…

备战蓝桥杯---刷二分与前缀和题

刷点题~ 1.二分多路归并算法 对于每一个技能,我们把它看成一个等差数列,我们把所有可能都放到一个集合里,排个序,取前m个大即可,现在考虑优化,假如m不是很大,我们直接用优先队列即可&#xff0…

单细胞RNA测序(scRNA-seq)SRA数据下载及fastq-dumq数据拆分

单细胞RNA测序(scRNA-seq)入门可查看以下文章: 单细胞RNA测序(scRNA-seq)工作流程入门 单细胞RNA测序(scRNA-seq)细胞分离与扩增 1. NCBI查询scRNA-seq SRA数据 NCBI地址: https…

继承.Java

目录 1,概述 1.1继承的含义 1.2什么时候用继承 1.3继承的好处 1.4继承的特点 2,继承的格式 3,可以继承哪些内容 4,成员方法和成员变量的访问特点 5,构造方法的访问特点 6,this,super…

windows版本-idea中下载的java版本在哪

1、点击idea的file-projectStructure 进入: 通过电脑目录进入该目录 找到bin目录,copy该目录地址 copy下来之后设置到系统环境变量中

C#项目引用解决方案中其他项目dll时,出现黄色感叹号的解决方案

问题引入 今天拿着老师傅的老项目,需要做通讯调试,说测试一下,便添加了一个项目A来编写结构体,然后在窗体程序项目B中引用A,发现B一引用A,在B项目的引用下面A就多了个黄色感叹号,一编译B项目&am…

瑞_Redis_商户查询缓存

文章目录 项目介绍1 短信登录2 商户查询缓存2.1 什么是缓存2.1.1 缓存的应用场景2.1.2 为什么要使用缓存2.1.3 Web应用中缓存的作用2.1.4 Web应用中缓存的成本 2.2 添加Redis缓存2.2.1 背景2.2.2 缓存模型和思路2.2.3 代码实现2.2.4 测试附:IDEA控制台输出自动换行设…

色域(BT2020/BT709/sRGB/DCI-P3/Rec.709/NTSC)

什么是色域 色域是对一种颜色进行编码的方法,也指一个技术系统能够产生的颜色的总和。在计算机图形处理中,色域是颜色的某个完全的子集。一般来说,高端投影仪和电视都会强调色域范围和对比度,而不是唯亮度标准论。 自然界可见光…

面试算法-139-盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾斜容器。…

Sybase ASE中的char(N)的坑以及与PostgreSQL的对比

1背景 昨天,一朋友向我咨询Sybase ASE中定长字符串类型的行为,说他们的客户反映,同样的char类型的数据,通过jdbc来查,Sybase库不会带空格,而PostgreSQL会带。是不是这样的?他是PostgreSQL的专业大拿,但因为他手头没有现成的Sybase ASE环境,刚好我手上有,便于一试。 …

(学习日记)2024.04.01:UCOSIII第二十九节:消息队列实验(待续)

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

LearnOpenGL_part1

创建窗口 - LearnOpenGL CN (learnopengl-cn.github.io) 最原始的黑框框&#xff1a; #include <glad/glad.h> #include <GLFW/glfw3.h> #include <iostream> int main() {glfwInit();//初始化GLFWglfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//配置G…

亚马逊AWS永久免费数据库

Amazon DynamoDB 是一项无服务器的 NoSQL 数据库服务&#xff0c;您可以通过它来开发任何规模的现代应用程序。作为无服务器数据库&#xff0c;您只需按使用量为其付费&#xff0c;DynamoDB 可以扩展到零&#xff0c;没有冷启动&#xff0c;没有版本升级&#xff0c;没有维护窗…

如何同时安全高效管理多个谷歌账号?

您的业务活动需要多个 Gmail 帐户吗&#xff1f;出海畅游&#xff0c;Gmail账号是少不了的工具之一&#xff0c;可以关联到Twitter、Facebook、Youtube、Chatgpt等等平台&#xff0c;可以说是海外网络的“万能锁”。但是大家都知道&#xff0c;以上这些平台注册多账号如果产生关…