【python学习】-用matplotlib实现将二维数据绘制为三维图形(三维多线图)并实战(三维散点图)

文章目录

  • 绘制一幅三维线图
  • 结合for循环绘制多幅三维线图(在一幅图上)
  • 美化图形

绘制一幅三维线图

#将二维数据绘制三维图(三维多线图)
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
import numpy as np
x=np.linspace(0,20,40)
y=2
y=y*np.ones(40)#保证与x轴的点数一致,这一步非常重要
z=np.sin(x * 2 * np.pi) / 2 + 0.5

ax = plt.figure().add_subplot(projection='3d')
ax.plot(x,y,z)#绘图

# 图像的其他参数设置
ax.view_init(15, -20)#图形展示角度
#ax.grid(False)#去掉网格
ax.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))#背景设置为白色
ax.w_yaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))
ax.w_zaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))
#坐标及坐标轴相关设置
ax.set_xlabel('x') #x轴坐标名称及字体样式
ax.set_ylabel('y') #x轴坐标名称及字体样式
ax.set_zlabel('z') #z轴坐标名称及字体样式
#ax.set_xlim(0,20)#x轴范围
#ax.set_zlim(0,40)
ax.set_yticks([1,2,3,4,5]) #y轴刻度字体大小
plt.show()


结合for循环绘制多幅三维线图(在一幅图上)

#将二维数据绘制三维图(三维多线图)
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
import numpy as np
x=np.linspace(0,20,40)
y_list=[1,3,5]

z=np.sin(x * 2 * np.pi) / 2 + 0.5

ax = plt.figure().add_subplot(projection='3d')
#结合for循环绘制多张线图
for i in range(0,3,1):
    y=y_list[i]
    y=y*np.ones(40)#保证与x轴的点数一致,这一步非常重要
    ax.plot(x,y,z)#绘图

# 图像的其他参数设置
ax.view_init(15, -20)#图形展示角度
#ax.grid(False)#去掉网格
ax.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))#背景设置为白色
ax.w_yaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))
ax.w_zaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))
#坐标及坐标轴相关设置
ax.set_xlabel('x') #x轴坐标名称及字体样式
ax.set_ylabel('y') #x轴坐标名称及字体样式
ax.set_zlabel('z') #z轴坐标名称及字体样式
#ax.set_xlim(0,20)#x轴范围
#ax.set_zlim(0,40)
ax.set_yticks([1,2,3,4,5]) #y轴刻度字体大小
plt.show()

美化图形

主要是调整图形清晰度,坐标轴以及图形颜色,线的粗细,添加label

#美化图形
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
import numpy as np
x=np.linspace(0,20,40)
y_list=[1,3,5]
z=np.sin(x * 2 * np.pi) / 2 + 0.5
color_list=['red','tab:blue','tab:green']#颜色
font3 = {'family' : 'Arial',
    'weight' : 'normal',
    'size'   : 14,
    }
ax = plt.figure().add_subplot(projection='3d')
#结合for循环绘制多张线图
for i in range(0,3,1):
    y=y_list[i]
    y=y*np.ones(40)#保证与x轴的点数一致,这一步非常重要
    ax.plot(x,y,z,linewidth=1,label='y='+str(y_list[i]),color=color_list[i])#绘图

# 图像的其他参数设置
ax.view_init(15, -20)#图形展示角度
ax.grid(False)#去掉网格
ax.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))#背景设置为白色
ax.w_yaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))
ax.w_zaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))
#坐标及坐标轴相关设置
ax.legend(frameon=False,fontsize='small',loc='center left') #设置图例及图中文本显示
ax.set_xlabel('x',font3) #x轴坐标名称及字体样式
ax.set_ylabel('y',font3) #x轴坐标名称及字体样式
ax.set_zlabel('z',font3) #z轴坐标名称及字体样式
ax.set_xlim(0,20)#x轴范围
#ax.set_zlim(0,40)
ax.set_yticks([1,2,3,4,5]) #y轴刻度字体大小

plt.rcParams['figure.figsize']=(8.0,6.0)
plt.rcParams['savefig.dpi'] = 200 #图片像素
plt.rcParams['figure.dpi'] = 200 #分辨率
plt.show()


截至此,内容来源于 [https://blog.csdn.net/qq_40481843/article/details/120888436](https://blog.csdn.net/qq_40481843/article/details/120888436) # 实战 这里需要自己找一张图片并修改为lena.png,放在py文件同级目录下
import cv2
import numpy as np
import matplotlib.pyplot as plt


'''
分别计算图像通道相邻像素的水平、垂直和对角线的相关系数并返回
'''
def RGB_correlation(channel,N):
  #计算channel通道
  h,w=channel.shape
  #随机产生pixels个[0,w-1)范围内的整数序列
  row=np.random.randint(0,h-1,N)
  col=np.random.randint(0,w-1,N)
  #绘制相邻像素相关性图,统计x,y坐标
  x=[]
  h_y=[]
  v_y=[]
  d_y=[]
  for i in range(N):
    #选择当前一个像素
    x.append(channel[row[i]][col[i]])
    #水平相邻像素是它的右侧也就是同行下一列的像素
    h_y.append(channel[row[i]][col[i]+1])
    #垂直相邻像素是它的下方也就是同列下一行的像素
    v_y.append(channel[row[i]+1][col[i]])
    #对角线相邻像素是它的右下即下一行下一列的那个像素
    d_y.append(channel[row[i]+1][col[i]+1])
  #三个方向的合到一起
  x=x*3
  y=h_y+v_y+d_y

  #结果展示
  # plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文乱码
  # plt.scatter(x,y)
  # plt.show()

  #计算E(x),计算三个方向相关性时,x没有重新选择也可以更改
  ex=0
  for i in range(N):
    ex+=channel[row[i]][col[i]]
  ex=ex/N
  #计算D(x)
  dx=0
  for i in range(N):
    dx+=(channel[row[i]][col[i]]-ex)**2
  dx/=N

  #水平相邻像素h_y
  #计算E(y)
  h_ey=0
  for i in range(N):
    h_ey+=channel[row[i]][col[i]+1]
  h_ey/=N
  #计算D(y)
  h_dy=0
  for i in range(N):
    h_dy+=(channel[row[i]][col[i]+1]-h_ey)**2
  h_dy/=N
  #计算协方差
  h_cov=0
  for i in range(N):
    h_cov+=(channel[row[i]][col[i]]-ex)*(channel[row[i]][col[i]+1]-h_ey)
  h_cov/=N
  h_Rxy=h_cov/(np.sqrt(dx)*np.sqrt(h_dy))

  #垂直相邻像素v_y
  #计算E(y)
  v_ey=0
  for i in range(N):
    v_ey+=channel[row[i]+1][col[i]]
  v_ey/=N
  #计算D(y)
  v_dy=0
  for i in range(N):
    v_dy+=(channel[row[i]+1][col[i]]-v_ey)**2
  v_dy/=N
  #计算协方差
  v_cov=0
  for i in range(N):
    v_cov+=(channel[row[i]][col[i]]-ex)*(channel[row[i]+1][col[i]]-v_ey)
  v_cov/=N
  v_Rxy=v_cov/(np.sqrt(dx)*np.sqrt(v_dy))

  #对角线相邻像素d_y
  #计算E(y)
  d_ey=0
  for i in range(N):
    d_ey+=channel[row[i]+1][col[i]+1]
  d_ey/=N
  #计算D(y)
  d_dy=0
  for i in range(N):
    d_dy+=(channel[row[i]+1][col[i]+1]-d_ey)**2
  d_dy/=N
  #计算协方差
  d_cov=0
  for i in range(N):
    d_cov+=(channel[row[i]][col[i]]-ex)*(channel[row[i]+1][col[i]+1]-d_ey)
  d_cov/=N
  d_Rxy=d_cov/(np.sqrt(dx)*np.sqrt(d_dy))

  return h_Rxy,v_Rxy,d_Rxy,x,y

'''
分别计算图像img的各通道相邻像素的相关系数,默认随机选取3000对相邻像素
'''
def correlation(img,N=3000):
  img=cv2.imread(img)
  h,w,_=img.shape
  B,G,R=cv2.split(img)
  R_Rxy=RGB_correlation(R,N)
  G_Rxy=RGB_correlation(G,N)
  B_Rxy=RGB_correlation(B,N)

  x_list = [1,3,5]
  y_list = [R_Rxy[3], G_Rxy[3], B_Rxy[3]]
  z_list = [R_Rxy[4], G_Rxy[4], B_Rxy[4]]
  color_list = ['red', 'tab:blue', 'tab:green']  # 颜色
  font3 = {'family': 'Arial',
           'weight': 'normal',
           'size': 14,
           }
  ax = plt.figure().add_subplot(projection='3d')
  for i in range(0, 3, 1):
    x = x_list[i]
    x = x * np.ones(9000)
    y = y_list[i]
    z = z_list[i]
    ax.scatter(x, y, z, label='x=' + str(x_list[i]), c= R_Rxy[4], cmap=plt.cm.gnuplot, edgecolors='none',s=1)  # 绘图

  # 图像的其他参数设置
  ax.view_init(10, 30)  # 图形展示角度
  ax.grid(False)  # 去掉网格
  ax.xaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))  # 背景设置为白色
  ax.yaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))
  ax.zaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))
  # 坐标及坐标轴相关设置
  ax.legend(frameon=False, fontsize='small', loc='center left')  # 设置图例及图中文本显示
  ax.set_xlabel('x', font3)  # x轴坐标名称及字体样式
  ax.set_ylabel('y', font3)  # x轴坐标名称及字体样式
  ax.set_zlabel('z', font3)  # z轴坐标名称及字体样式
  ax.set_xlim(0, 5)  # x轴范围
  ax.set_ylim(250, 0)  # x轴范围
  # ax.set_zlim(0,40)
  # ax.set_xticks([1, 2, 3, 4, 5])  # y轴刻度字体大小

  plt.rcParams['figure.figsize'] = (8.0, 6.0)
  plt.rcParams['savefig.dpi'] = 200  # 图片像素
  plt.rcParams['figure.dpi'] = 200  # 分辨率
  plt.show()
#######################################
  # #结果展示
  # plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文乱码
  # plt.subplot(221)
  # plt.imshow(img[:,:,(2,1,0)])
  # plt.title('原图像')
  # #子图2
  # plt.subplot(222)
  # # plt.scatter(R_Rxy[3],R_Rxy[4],s=1,c='red')
  # plt.scatter(R_Rxy[3],R_Rxy[4],c= R_Rxy[4], cmap=plt.cm.gnuplot, edgecolors='none',s=1)
  # plt.title('通道R')
  #
  # #子图3
  # plt.subplot(223)
  # plt.scatter(G_Rxy[3],G_Rxy[4],s=1,c='green')
  # plt.title('通道G')
  # #子图4
  # plt.subplot(224)
  # plt.scatter(B_Rxy[3],B_Rxy[4],s=1,c='blue')
  # plt.title('通道B')
  # plt.show()

  return R_Rxy[0:3],G_Rxy[0:3],B_Rxy[0:3]


def main():
  img='./lena.jpeg'
  img1='./lena_encrypt1.png'
  img2='./lena_encrypt2.png'
  R_Rxy,G_Rxy,B_Rxy=correlation(img)
  #输出结果保留四位有效数字
  print("******该图像的各通道各方向的相关系数为*****")
  print('通道\tHorizontal\tVertical\tDiagonal')
  print(' R    \t{:.4f}    {:.4f}    {:.4f}'.format(R_Rxy[0],R_Rxy[1],R_Rxy[2]))
  print(' G    \t{:.4f}    {:.4f}    {:.4f}'.format(G_Rxy[0],G_Rxy[1],G_Rxy[2]))
  print(' B    \t{:.4f}    {:.4f}    {:.4f}'.format(B_Rxy[0],B_Rxy[1],B_Rxy[2]))

if __name__== '__main__':
  main()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32F4xx之库函数

一、库函数介绍 库函数与寄存器的区别 库函数:不需要自己写很多代码,可以利用软件生成代码。使用的时候必须添加库文件。库文件是芯片厂商写好了。占用空间大。 寄存器:自己写的代码量大,没有软件生成代码。使用的时候不需要库文件…

QT c++和qml交互实例

文章目录 一、demo效果图二、c和qml交互的基本方式1、qml访问C类对象 三、关键代码1、工程结构图2、c代码MainWindow.cppMainQuickView.cppStudentInfoView.cppStudentInfoModel.cpp 3、qml代码main.qmlMainQuickTopRect.qmlMainQuickMiddleRect.qmlMainQuickMiddleTableRect.q…

@Async正确使用姿势

Async注解可以使被修饰的方法成为异步方法,简单且方便,这篇文章将教你如何正确的使用它 先谈谈大多数人对Aysnc的认识: 如果直接使用Async,未指定线程池 并且 容器内也没有beanName为taskExecutor的bean,则会使…

im6ull学习总结(三-3)freetype

1、Freetype简介 FreeType是一个开源的字体渲染引擎,主要用于将字体文件转换为位图或矢量图形,并在屏幕上渲染出高质量的字体。它提供了一组API,使开发者能够在自己的应用程序中使用和呈现字体。 FreeType最初是作为一个独立项目开发的&…

欢乐钓鱼^^

欢迎来到程序小院 欢乐钓鱼 玩法&#xff1a;点击鼠标左键左右晃动的鱼钩&#xff0c;下方左右移动的鱼对准鱼的方向即可进行钓鱼&#xff0c; 不同的鱼不同的分数&#xff0c;快去钓鱼吧^^开始游戏https://www.ormcc.com/play/gameStart/241 html <div id"gamediv&qu…

(leetcode)替换所有的问号 -- 模拟算法

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 本题链接 力扣&#xff08;LeetCode&#xff09; 输入描述 string modifyString(string s) 输入一个字符串&#xff0c;字符串中仅包含小写字母和 ‘?’ 字符。 输出描述 将问号替换为小写字母&#xff0c;且这个替…

数据结构期末复习

章节知识点分析 第一章绪论 基本概念 数据 数据元素&#xff08;记录、表目&#xff0c;是数据集合中一个个体&#xff09; 数据项&#xff1a;一个数据元素可由若干数据项组成 数据对象&#xff1a;性质相同的数据元素的集合&#xff0c;是数据的一个子集 数据结构&…

LLM漫谈(二)| QAnything支持任意格式文件或数据库的本地知识库问答系统

一、QAnything介绍 QAnything (Question and Answer based on Anything) 是致力于支持任意格式文件或数据库的本地知识库问答系统&#xff0c;可断网安装使用。 您的任何格式的本地文件都可以往里扔&#xff0c;即可获得准确、快速、靠谱的问答体验。 目前已支持格式: PDF&…

MiniCom串口调试工具使用

一、程序安装 执行下面代码&#xff0c;安装minicom。 sudo apt-get install minicom 二、查看串口设备名称 先拔掉串口运行下面指令&#xff0c;获得所有设备名称,插上串口再运行一次&#xff0c;新增的就是串口设备名称&#xff0c;记住串口设备名称&#xff0c;以串口设备名…

LeetCode-整数反转(7)

题目描述&#xff1a; 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231&#xff0c;231− 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff0…

[4K80 AI ISP IPC芯片]

4K80 AI ISP IPC芯片 Hi3403V100是一颗面向监控市场推出的专业 Ultra-HD Smart IP Camera SOC&#xff0c;该芯片最高支持四路sensor输入&#xff0c;支持最高4K60的ISP图像处理能力&#xff0c;支持3F WDR加粗样式、多级降噪、六轴防抖、硬件拼接等多种图像增强和处理算法&am…

C++多态性——(5)运算符重载(第二节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 身先才能率人&#xff0c;律己才能服人…

【SpringBoot】公共字段自动填充功能实现(枚举、自定义注解、AOP、反射)

1. 自定义注解 使用interface语法来定义注解&#xff08;Annotation&#xff09;。 注解的参数类似无参数方法&#xff0c;可以用default设定一个默认值&#xff0c;比如String value() default "";。 元注解&#xff1a;有一些注解可以修饰其他注解&#xff0c;这…

基础面试题整理2

1.抽象类与接口区别 语法&#xff1a; 抽象类用abstract定义&#xff1b;接口用interface定义抽象类被子类继承extends&#xff08;不可用final修饰&#xff09;&#xff1b;接口被类实现implements抽象类的属性访问无限制,方法不可用private修饰&#xff1b;接口中的方法只能…

【STM32】STM32学习笔记-DMA数据转运+AD多通道(24)

00. 目录 文章目录 00. 目录01. DMA简介02. DMA相关API2.1 DMA_Init2.2 DMA_InitTypeDef2.3 DMA_Cmd2.4 DMA_SetCurrDataCounter2.5 DMA_GetFlagStatus2.6 DMA_ClearFlag 03. DMA数据单通道接线图04. DMA数据单通道示例05. DMA数据多通道接线图06. DMA数据多通道示例一07. DMA数…

计算机网络(2)

计算机网络&#xff08;2&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 计算机网络和因特网&#xff08;2&#xff09;分组交换网中的时延、丢包和吞吐量时延丢包吞吐量总结 协议层次及其服务模型模型类型OSI模型分析TCP/IP模型分析 追溯历史 小程一言 我…

数据结构——堆排序

什么是堆排序 堆排序就是利用堆&#xff08;假设利用大堆&#xff09;进行排序的算法。他的基本思想是&#xff0c;将待排序的序列构造成一个大顶堆。此时&#xff0c;整个序列的最大值就是堆顶的根节点。将他移走&#xff08;其实就是将其与堆数组的末尾元素交换&#xff0c;…

简单 Web Server 程序的设计与实现 (2024)

1.题目描述 Web 服务是 Internet 最方便与受用户欢迎的服务类型&#xff0c;它的影响力也远远超出了专业技术范畴&#xff0c; 已广泛应用于电子商务、远程教育、远程医疗与信息服务等领域&#xff0c;并且有继续扩大的趋势。目前很多 的 Internet 应用都是基于 Web 技术的&…

Java快速排序希尔排序归并排序

快速排序算法 快速排序的原理&#xff1a;选择一个关键值作为基准值。比基准值小的都在左边序列&#xff08;一般是无序的&#xff09;&#xff0c;比基准值大的都在右边&#xff08;一般是无序的&#xff09;。一般选择序列的第一个元素。 一次循环&#xff1a;从后往前比较&…

VMware中删除虚拟机

虚拟机使用完成后&#xff0c;需要删除虚拟机如何操作呢&#xff1f; 1.首先进入VMware 2.选择需要删除的虚拟机&#xff0c;点击右键 3.直接选择“移除”&#xff1f; 当然不是&#xff0c;这只是从这么目录显示中去掉了&#xff0c;并非 “真正” 删除该虚拟机 注意&#x…
最新文章