调整等值线图的绘制值
Adjusting Plotted Values of Contour Plots
我正在绘制等高线图,它们基本上是流体动力学系统的解析或数值解。我不认为技术方面的东西真的太重要了,但这是我的情节。第一个图是数值(矩阵系统)解,第二个图是很好的封闭形式(单论坛)解。
可以看出,我的第二个图的右侧有气泡。查看 legend/scale,我有负值。我不想有负值,或者不绘制它们,尽管我不确定如何在我的代码中调整它。我花了一些时间研究如何将 z 值调整为仅正值,但我似乎无法理解。我会放下我的情节代码,然后是我在情节中使用的漂亮的封闭形式函数。
import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
import scipy.special as sp1
from mpl_toolkits.mplot3d import Axes3D
def v(r,z,gamma):
a=r*(1-z/gamma)
sums = 0
for n in range(1,26):
sums += ((sp1.iv(1(n*np.pi*r)/gamma))/(n*sp1.iv(1(n*np.pi)/gamma)))*np.sin(n*np.pi*z/gamma)
return a-(2/np.pi)*sums
def plot_contour(a, filename=None, zlabel='v(r,z)',cmap=plt.cm.gnuplot):
fig = plt.figure(figsize=(5,4))
ax = fig.add_subplot(111)
x = np.arange(a.shape[0])
y = np.arange(a.shape[1])
X, Y = np.meshgrid(x, y)
Z = a[X, Y]
cset = ax.contourf(X, Y, Z, 20, cmap=cmap)
ax.set_xlabel('r')
ax.set_ylabel('z')
ax.set_title('\u0393=2.5')
ax.axis('off')
ax.set_aspect(1)
cb = fig.colorbar(cset, shrink=0.5, aspect=5)
cb.set_label(zlabel)
if filename:
fig.savefig(filename,dpi=1600)
plt.close(fig)
return filename
else:
return ax
...
plot_contour(v1, 'gamma25e+1')
这是所有必要的代码。剩下的就是矩阵解的东西,这只是一堆线性代数。关于我需要添加或调整以防止负值出现在第二个图上的任何帮助。它应该看起来和第一个一模一样。
I've spent some time looking into how to adjust the z values to being positive only
你能做什么在很大程度上取决于你想对零以下的结果做什么,如果你的唯一目的是让零以下的点显示为零,你可以简单地让它们为零,然而那会显示一个错误的结果。
x = np.arange(a.shape[0])
y = np.arange(a.shape[1])
X, Y = np.meshgrid(x, y)
Z = a[X, Y]
Z[Z < 0] = 0
另一种解决方案是将你的数据减去最小值,使结果的最小值为0。
x = np.arange(a.shape[0])
y = np.arange(a.shape[1])
X, Y = np.meshgrid(x, y)
Z = a[X, Y]
Z -= np.amin(Z)
我正在绘制等高线图,它们基本上是流体动力学系统的解析或数值解。我不认为技术方面的东西真的太重要了,但这是我的情节。第一个图是数值(矩阵系统)解,第二个图是很好的封闭形式(单论坛)解。
可以看出,我的第二个图的右侧有气泡。查看 legend/scale,我有负值。我不想有负值,或者不绘制它们,尽管我不确定如何在我的代码中调整它。我花了一些时间研究如何将 z 值调整为仅正值,但我似乎无法理解。我会放下我的情节代码,然后是我在情节中使用的漂亮的封闭形式函数。
import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
import scipy.special as sp1
from mpl_toolkits.mplot3d import Axes3D
def v(r,z,gamma):
a=r*(1-z/gamma)
sums = 0
for n in range(1,26):
sums += ((sp1.iv(1(n*np.pi*r)/gamma))/(n*sp1.iv(1(n*np.pi)/gamma)))*np.sin(n*np.pi*z/gamma)
return a-(2/np.pi)*sums
def plot_contour(a, filename=None, zlabel='v(r,z)',cmap=plt.cm.gnuplot):
fig = plt.figure(figsize=(5,4))
ax = fig.add_subplot(111)
x = np.arange(a.shape[0])
y = np.arange(a.shape[1])
X, Y = np.meshgrid(x, y)
Z = a[X, Y]
cset = ax.contourf(X, Y, Z, 20, cmap=cmap)
ax.set_xlabel('r')
ax.set_ylabel('z')
ax.set_title('\u0393=2.5')
ax.axis('off')
ax.set_aspect(1)
cb = fig.colorbar(cset, shrink=0.5, aspect=5)
cb.set_label(zlabel)
if filename:
fig.savefig(filename,dpi=1600)
plt.close(fig)
return filename
else:
return ax
...
plot_contour(v1, 'gamma25e+1')
这是所有必要的代码。剩下的就是矩阵解的东西,这只是一堆线性代数。关于我需要添加或调整以防止负值出现在第二个图上的任何帮助。它应该看起来和第一个一模一样。
I've spent some time looking into how to adjust the z values to being positive only
你能做什么在很大程度上取决于你想对零以下的结果做什么,如果你的唯一目的是让零以下的点显示为零,你可以简单地让它们为零,然而那会显示一个错误的结果。
x = np.arange(a.shape[0])
y = np.arange(a.shape[1])
X, Y = np.meshgrid(x, y)
Z = a[X, Y]
Z[Z < 0] = 0
另一种解决方案是将你的数据减去最小值,使结果的最小值为0。
x = np.arange(a.shape[0])
y = np.arange(a.shape[1])
X, Y = np.meshgrid(x, y)
Z = a[X, Y]
Z -= np.amin(Z)