基于Python绘制子图及子图刻度的变换等的问题


Posted in Python onMay 23, 2021

1、涉及到图的对比会用到子图形式展示

先看看效果

基于Python绘制子图及子图刻度的变换等的问题

2、绘制代码如下

accuracy_alexnet_clef = [78.05, 78.43, 78.65, 78.61, 78.69]
accuracy_resnet_clef  = [84.56, 84.84, 85.07, 85.01, 85.13]
accuracy_alexnet_office10 = [87.30, 87.57, 87.78, 87.72, 87.50]
accuracy_resnet_office10  = [96.31, 96.35, 96.62, 96.43, 96.15]
orders = ['2', '3', '5', '10', '20']
names = ['alexnet', 'resnet']
# 创建两幅子图
f, ax = plt.subplots(2,1,figsize=(6, 8))
# 第一根柱子偏移坐标
x = [i for i in range(len(orders))]
# 第二根柱子偏移坐标
x1 = [i + 0.35 for i in range(len(orders))]
# 两幅子图之间的间距
plt.subplots_adjust(wspace =0, hspace =0.4)
# 选择第一幅图
figure_1 = ax[0]
# 设置x轴偏移和标签
figure_1.set_xticks([i+0.15 for i in x])
figure_1.set_xticklabels(orders)
# 设置y轴的范围
figure_1.set_ylim(bottom=77,top=86)
# 绘制柱状图,x表示x轴内容,accuracy_alexnet_clef表示y轴的内容,alpha表示透明度,width表示柱子宽度
# label表示图列
figure_1.bar(x, accuracy_alexnet_clef, alpha=0.7, width = 0.35, facecolor = '#4c72b0', label='Alexnet')
figure_1.bar(x1, accuracy_resnet_clef, alpha=0.7, width = 0.35, facecolor = '#dd8452', label='Resnet')
figure_1.set_ylabel('Accuracy%') # 设置y轴的标签
figure_1.set_xlabel('Order') # 设置x轴的名称
figure_1.set_title('Alexnet') # 设置图一标题名称
figure_1.legend() # 显示图一的图例
# 选择第二幅图
figure_2 = ax[1]
figure_1.set_xticks([i+0.15 for i in x])
figure_1.set_xticklabels(orders)
figure_2.set_ylim(bottom=77,top=100)
figure_2.bar(x, accuracy_alexnet_office10,alpha=0.7,width = 0.35,facecolor = '#c44e52', label='Alexnet')
figure_2.bar(x1, accuracy_resnet_office10,alpha=0.7,width = 0.35,facecolor = '#5f9e6e', label='Alexnet')
# figure_2.bar(orders, accuracy_resnet_clef,alpha=0.7,width = 0.35,facecolor = '#dd8452')
figure_2.set_ylabel('Accuracy%')
figure_2.set_xlabel('Order')
figure_2.set_title('Resnet')
figure_2.legend()
f.suptitle('ImageCLEF_DA') # 设置总标题
plt.show()

补充:python使用matplotlib在一个图形中绘制多个子图以及一个子图中绘制多条动态折线问题

在讲解绘制多个子图之前先简单了解一下使用matplotlib绘制一个图,导入绘图所需库matplotlib并创建一个等间隔的列表x,将[0,2*pi]等分为50等份,绘制函数sin(x)。当没有给定x轴数值时,默认以下标作为x的值,如果x值确定,则绘图时写为plt.plot(x,y) 。

如若想要绘制一个图时写入标签,则写为plt.plot(x,y,label="figure1")。

from numpy import *
import matplotlib.pyplot as plt 
x = linspace(0, 2 * pi, 50)
plt.plot(sin(x))
plt.xlabel('x-label')
plt.ylabel('y-label', fontsize='large')
plt.title('title')

基于Python绘制子图及子图刻度的变换等的问题

以下先将整体代码插入,再分布讲解:

import numpy as np
import matplotlib.pyplot as plt 
from matplotlib.ticker import MultipleLocator, FormatStrFormatter 
def minmax_value(list1):
    minvalue=min(list1)
    maxvalue=max(list1)
    return minvalue,maxvalue
plt.figure(figsize=(16,14),dpi=98)
xmajorLocator = MultipleLocator(1) #将x主刻度标签设置为1的倍数
plt.rcParams['font.sans-serif']=['SimHei']  
plt.rcParams['axes.unicode_minus'] = False
p1 = plt.subplot(121)
p2 = plt.subplot(122)
#图中展示点的数量
pointcount=5
x=[i for i in range(20)]
print(x)
y1=[i**2 for i in range(20)]
y2=[i*4 for i in range(20)]
y3=[i*3+2 for i in range(20)]
y4=[i*4 for i in range(20)]
for i in range(len(x)-1):
    if i<pointcount:
        minx,maxx=minmax_value(x[:pointcount])
        minx,maxx=minmax_value(x[:pointcount])
        minyA,maxyA=minmax_value(y1[:pointcount])
        minyB,maxyB=minmax_value(y2[:pointcount])
        
        maxy1=max(maxyA,maxyB)
        miny1=min(minyA,minyB)
        p1.axis([minx,maxx,miny1,maxy1])
        p1.grid(True)
        A,=p1.plot(x[:pointcount],y1[:pointcount],"g-")
        B,=p1.plot(x[:pointcount],y2[:pointcount],"b-")
        #设置主刻度标签的位置,标签文本的格式
        p1.xaxis.set_major_locator(xmajorLocator)
        legend=p1.legend(handles=[A,B],labels=["图1","图2"])    
        
        
        minx,maxx=minmax_value(x[:pointcount])
        minx,maxx=minmax_value(x[:pointcount])
        minyA,maxyA=minmax_value(y3[:pointcount])
        minyB,maxyB=minmax_value(y4[:pointcount])
        
        maxy1=max(maxyA,maxyB)
        miny1=min(minyA,minyB)
        p2.axis([minx,maxx,miny1,maxy1])
        p2.grid(True)
        A,=p2.plot(x[:pointcount],y3[:pointcount],"r-")
        B,=p2.plot(x[:pointcount],y4[:pointcount],"y-")
        #设置主刻度标签的位置,标签文本的格式
        p2.xaxis.set_major_locator(xmajorLocator)
        legend=p2.legend(handles=[A,B],labels=["图3","图4"])  
    elif i>=pointcount:
        minx,maxx=minmax_value(x[i-pointcount:i])
        minx,maxx=minmax_value(x[i-pointcount:i])
        minyA,maxyA=minmax_value(y1[i-pointcount:i])
        minyB,maxyB=minmax_value(y2[i-pointcount:i])
        
        maxy1=max(maxyA,maxyB)
        miny1=min(minyA,minyB)
        p1.axis([minx,maxx,miny1,maxy1])
        p1.grid(True)
        A,=p1.plot(x[i-pointcount:i],y1[i-pointcount:i],"g-")
        B,=p1.plot(x[i-pointcount:i],y2[i-pointcount:i],"b-")
        #设置主刻度标签的位置,标签文本的格式
        p1.xaxis.set_major_locator(xmajorLocator)
        legend=p1.legend(handles=[A,B],labels=["图1","图2"])
        minx,maxx=minmax_value(x[i-pointcount:i])
        minx,maxx=minmax_value(x[i-pointcount:i])
        minyA,maxyA=minmax_value(y3[i-pointcount:i])
        minyB,maxyB=minmax_value(y4[i-pointcount:i])
        
        maxy1=max(maxyA,maxyB)
        miny1=min(minyA,minyB)
        p2.axis([minx,maxx,miny1,maxy1])
        p2.grid(True)
        A,=p2.plot(x[i-pointcount:i],y3[i-pointcount:i],"r-")
        B,=p2.plot(x[i-pointcount:i],y4[i-pointcount:i],"y-")
        #设置主刻度标签的位置,标签文本的格式
        p2.xaxis.set_major_locator(xmajorLocator)
        legend=p2.legend(handles=[A,B],labels=["图3","图4"])
    p1.set_xlabel("横轴属性名一",fontsize=14)
    p1.set_ylabel("纵轴属性名一",fontsize=14)
    p1.set_title("主题一",fontsize=18)
    
    p2.set_xlabel("横轴属性名二",fontsize=14)
    p2.set_ylabel("纵轴属性名二",fontsize=14)
    p2.set_title("主题二",fontsize=18)
    plt.pause(0.3)
    plt.tight_layout(pad=4, w_pad=4.0, h_pad=3.0)

运行结果为:

基于Python绘制子图及子图刻度的变换等的问题

1、导入库

import numpy as np
import matplotlib.pyplot as plt 
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

2、由于绘图过程中多次使用获取最大最小值,将获取最大最小值写入函数,后面直接调用函数即可。

def minmax_value(list1):
    minvalue=min(list1)
    maxvalue=max(list1)
    return minvalue,maxvalue

3、

(1)创建自定义图像,并设置figured的长和宽以及dpi参数指定绘图对象的分辨率;

(2)设置x轴刻度的间隔;

(3)对本次绘图中的字体进行设置;

(4)在matplotlib下,一个figure对象可以包含多个子图(Axes),使用subplot()快速绘制。

plt.figure(figsize=(16,14),dpi=98)xmajorLocator = MultipleLocator(1)
plt.rcParams['font.sans-serif']=['SimHei']  plt.rcParams['axes.unicode_minus'] = False
 
p1 = plt.subplot(121)p2 = plt.subplot(122)

4、当数据量过多时,对数据一次性展示不能够达到对数据内部信息的解读。本例采用一次展示其中一部分数据,并动态的更新图片,于此同时,动态更新横纵坐标轴的取值范围。下面代码首先设置了每次展示点的数量,并获取了主题一中的所有数据值。根据x取值范围和值域y获取当前绘图过程中的横纵坐标取值范围,最后根据x,y的值进行绘图。

下面将先在一个子图上显示两条静态折现。当使用动态的折线图时,只需动态更新数据和横纵坐标的取值范围。总体代码中已经写出,下面不再赘述。

#图中展示点的数量
pointcount=5
x=[i for i in range(20)]
y1=[i**2 for i in range(20)]
y2=[i*4 for i in range(20)]
minx,maxx=minmax_value(x[:pointcount])
minyA,maxyA=minmax_value(y1[:pointcount])
minyB,maxyB=minmax_value(y2[:pointcount])
        
maxy1=max(maxyA,maxyB)
miny1=min(minyA,minyB)
p1.axis([minx,maxx,miny1,maxy1])
p1.grid(True)#绘图过程中出现的网格设置
A,=p1.plot(x[:pointcount],y1[:pointcount],"g-")
B,=p1.plot(x[:pointcount],y2[:pointcount],"b-")#设置主刻度标签的位置,标签文本的格式p1.xaxis.set_major_locator(xmajorLocator)legend=p1.legend(handles=[A,B],labels=["图1","图2"])

结果如下所示:

基于Python绘制子图及子图刻度的变换等的问题

5、设置边界,不设置边界经常会因为横纵轴的字体太大等其他原因导致横纵轴或者标题只能显示其中一部分。

plt.tight_layout(pad=4, w_pad=4.0, h_pad=3.0)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简明 Python 基础学习教程
Feb 08 Python
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 Python
Python随机生成数据后插入到PostgreSQL
Jul 28 Python
Python3解决棋盘覆盖问题的方法示例
Dec 07 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
django 信号调度机制详解
Jul 19 Python
python3在同一行内输入n个数并用列表保存的例子
Jul 20 Python
Python调用scp向服务器上传文件示例
Dec 22 Python
Python 项目转化为so文件实例
Dec 23 Python
python获取响应某个字段值的3种实现方法
Apr 30 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
Jan 05 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
Feb 01 Python
聊聊pytorch测试的时候为何要加上model.eval()
May 23 #Python
PyTorch 如何自动计算梯度
May 23 #Python
解决numpy和torch数据类型转化的问题
May 23 #Python
Python 用户输入和while循环的操作
May 23 #Python
解决Tkinter中button按钮未按却主动执行command函数的问题
May 23 #Python
python tkinter Entry控件的焦点移动操作
May 22 #Python
python3.7.2 tkinter entry框限定输入数字的操作
May 22 #Python
You might like
在PHP中操作Excel实例代码
2010/04/29 PHP
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
php 实现银联商务H5支付的示例代码
2019/10/12 PHP
ext for eclipse插件安装方法
2008/04/27 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
mpvue+vant app搭建微信小程序的方法步骤
2019/02/11 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
2019/09/03 jQuery
JavaScript简易计算器制作
2020/01/17 Javascript
Python天气预报采集器实现代码(网页爬虫)
2012/10/07 Python
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
Python中正则表达式详解
2017/05/17 Python
解读python logging模块的使用方法
2018/04/17 Python
详解Python3之数据指纹MD5校验与对比
2019/06/11 Python
python requests更换代理适用于IP频率限制的方法
2019/08/21 Python
导致python中import错误的原因是什么
2020/07/01 Python
Python文件夹批处理操作代码实例
2020/07/21 Python
python把一个字符串切开的实例方法
2020/09/27 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
Html5让容器充满屏幕高度或自适应剩余高度的布局实现
2020/05/14 HTML / CSS
UNIX文件名称有什么规定
2013/03/25 面试题
电子商务网站的创业计划书
2014/01/05 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
个人学习总结范文
2015/02/15 职场文书
全新239军机修复记
2022/04/05 无线电
Apache SkyWalking 监控 MySQL Server 实战解析
2022/09/23 Servers