Python画三维图-----插值平滑数据

一、二维的插值方法:

  1. 原始数据(x,y)
  2. 先对横坐标x进行扩充数据量,采用linspace。【如下面例子,由7个值扩充到300个】
  3. 采用scipy.interpolate中的spline来对纵坐标数据y进行插值【也由7个扩充到300个】。
  4. 画图
import matplotlib.pyplot as plt
import numpy as np#数据
T = np.array([6, 7, 8, 9, 10, 11, 12])
power = np.array([1.53E+03, 5.92E+02, 2.04E+02, 7.24E+01, 2.72E+01, 1.10E+01, 4.70E+00])
#插值
from scipy.interpolate import spline
xnew = np.linspace(T.min(),T.max(),300) #300 represents number of points to make between T.min and T.max
power_smooth = spline(T,power,xnew)
print(xnew.shape)  #(300,)
print(power_smooth.shape)  #(300,)#画图
plt.plot(xnew,power_smooth)
plt.show()

二、三维平滑图---插值:

1、数据:

x = [0.1,0.2,……,0.9]   (shape = (9))

y = [0.1,0.2,……,0.9] (shape = (9))

z = 【81个数据】(shape = (81))

生成数据

x = np.linspace(0.1,0.9,9)
y = np.linspace(0.1,0.9,9)
z = np.random.rand(81)

2、将x和y进行扩充到想要的大小:

【两种方法:np.arange和np.linspace】

xnew = np.arange(0.1, 1, 0.03)  【shape=(31)】
ynew = np.arange(0.1, 1, 0.03)   【shape=(31)】

或者

xnew = np.linspace(0.1, 0.9, 31)

ynew = np.linspace(0.1, 0.9, 31)

3、对z进行插值:

采用 scipy.interpolate.interp2d函数进行插值。

x,y原数据:【x.shape=9,y.shape=9,z.shape=81】

  f = interpolate.interp2d(x, y, z, kind=‘cubic‘)

x,y扩充数据:【xnew.shape=31,y.shape=31】

  znew = f(xnew, ynew)   【得到的znew.shape = (31,31)】

  znew为插值后的z

4、画图:

采用  from mpl_toolkits.mplot3d import Axes3D进行画三维图

Axes3D简单用法:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection=‘3d‘)

比如采用plot_trisurf画三维图:plot_trisurf(x,y,z)

【plot_trisurf对数据要求是:x.shape = y.shape = z.shape,所以x和y的shape需要修改,采用np.meshgrid,且都为一维数据】

  

#修改x,y,z输入画图函数前的shape
xx1, yy1 = np.meshgrid(xnew, ynew)

newshape = (xx1.shape[0])*(xx1.shape[0])
y_input = xx1.reshape(newshape)
x_input = yy1.reshape(newshape)
z_input = znew.reshape(newshape)

5、所有代码:

# 载入模块
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import pandas as pd
import seaborn as sns
from scipy import interpolate

#生成数据
x = np.linspace(0.1,0.9,9)
y = np.linspace(0.1,0.9,9)
z = np.random.rand(81)

#插值
# xx, yy = np.meshgrid(x, y)

f = interpolate.interp2d(x, y, z, kind=‘cubic‘)
xnew = np.arange(0.1, 1, 0.03)
ynew = np.arange(0.1, 1, 0.03)
znew = f(xnew, ynew)

#修改x,y,z输入画图函数前的shape
xx1, yy1 = np.meshgrid(xnew, ynew)
newshape = (xx1.shape[0])*(xx1.shape[0])
y_input = xx1.reshape(newshape)
x_input = yy1.reshape(newshape)
z_input = znew.reshape(newshape)

#画图
sns.set(style=‘white‘)
fig = plt.figure()
ax = fig.add_subplot(111, projection=‘3d‘)
ax.plot_trisurf(x_input,y_input,z_input,cmap=cm.coolwarm)
plt.show()

原文地址:https://www.cnblogs.com/Lee-yl/p/10255666.html

时间: 2024-09-29 19:24:15

Python画三维图-----插值平滑数据的相关文章

TensorFlow的初次使用+Python画3D图和计算KL散度

ython计算KL散度import numpy as np import scipy.stats x = [np.random.randint(1,11) for i in range(10)] print(x) print(np.sum(x)) px = x/np.sum(x)#归一化 print(px) y = [np.random.randint(1, 11) for i in range(10)] print(y) print(np.sum(y)) py = y / np.sum(y)#

python画完图后运行闪退解决办法

最近学习python,用matplotlib库画图,运行程序后,就会闪退. 解决办法:     python2.*后面加上:raw_input()     python3.*后面加上:input() 我的python是python3.2,最后需加input,如下: 如果你是3.*后面加的raw_input(),就会出现如下错误:

利用python画折线图

# encoding=utf-8import matplotlib.pyplot as pltfrom pylab import * #支持中文mpl.rcParams['font.sans-serif'] = ['SimHei'] names = ['5', '10', '15', '20', '25']x = range(len(names))y = [0.855, 0.84, 0.835, 0.815, 0.81]y1=[0.86,0.85,0.853,0.849,0.83]#plt.pl

python之画三维图像

一:利用的包:(1)构建三维对象:mpl_toolkits.mplot3d里面导入Axes3D(2)数据方面操作:numpy(3)绘图工具包:matplotlib.pyplot 二:绘图:1.绘图主要分成两种情况:(1)一种是根据函数来绘制三维图(2)一种是根据三维坐标绘制散点图 2.代码一:绘制散点图(加颜色,修饰什么的省略) import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import

python中matplotlib画折线图实例(坐标轴数字、字符串混搭及标题中文显示)

最近在用python中的matplotlib画折线图,遇到了坐标轴 "数字+刻度" 混合显示.标题中文显示.批量处理等诸多问题.通过学习解决了,来记录下.如有错误或不足之处,望请指正. 一.最简单的基本框架如下:已知x,y,画出折线图并保存.此时x和y均为数字. 1 # -*- coding: utf-8 -*- 2 3 import matplotlib.pyplot as plt #引入matplotlib的pyplot子库,用于画简单的2D图 4 import random 5

matlab 画二维图与三维图

二维图 ezplot('sin(x)');%默认范围 ezplot('sin(x)',[-4 4]);%自己设定范围 三维图 ezmesh('x*x+y*y');%默认范围

matlab中画三维图形

这里主要讲述两个方法用matlab画三维图形: 1.mesh函数 先看一个简单的例子: 1 x = 1:1:3; 2 y = 1:1:4; 3 [X, Y] = meshgrid(x, y); 4 Z = zeros(4,3); 5 Z = [ 1 2 3; 6 2 3 4; 7 3 4 5; 8 4 5 6] 9 mesh(X, Y, Z); 这是个简单的用mesh函数画的三维图,结果是: 这里需要注意一点: 矩阵Z的行列,Z的行是Y坐标系的值(meshgrid的右边位置的数y),Z的列是X坐

Matplotlib学习---用matplotlib画折线图(line chart)

这里利用Jake Vanderplas所著的<Python数据科学手册>一书中的数据,学习画图. 数据地址:https://raw.githubusercontent.com/jakevdp/data-CDCbirths/master/births.csv 准备工作:先导入matplotlib和pandas,用pandas读取csv文件,然后创建一个图像和一个坐标轴 import pandas as pd from matplotlib import pyplot as plt birth=p

推荐几款画韦恩图的在线工具

(1)http://bioinformatics.psb.ugent.be/webtools/Venn/ 操作简单,不仅画出了韦恩图,还很贴心的给出了数据统计的结果并列出了各个部分对应的ID,且提供直接下载.缺点是颜色和大小不可调. (2)http://bioinfogp.cnb.csic.es/tools/venny/index.html 这款比较漂亮,操作也很简单,但是不能根据列表大小调整生成的圆圈大小. (3)http://www.cs.kent.ac.uk/people/staff/pj