gpt4 book ai didi

python - matplotlib 正确的颜色/颜色条,用于绘制具有不同颜色的多个表面

转载 作者:太空宇宙 更新时间:2023-11-04 00:54:46 26 4
gpt4 key购买 nike

是否可以在一个 pyplot 图形中绘制多个曲面?这是我的尝试。 ax.plot_surface 命令似乎重置了图,因为我在结果图中只得到一个平面。我希望生成“堆叠”的平面,每个平面都有独特的颜色,以及一个显示每种颜色数值的颜色条。目前我的颜色显示错误。

import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import pylab
from scipy.interpolate import griddata

dat = open('ex.csv', 'w')
dat.write('x,y,z,c\n')
for x in range(20):
for y in range(20):
for c in range(0,7):
dat.write(','.join([str(s) for s in [x,y,x+y+c,c/10.0,'\n']]))
dat.close()

fig = matplotlib.pyplot.gcf()
dat = np.genfromtxt('ex.csv', delimiter=',',skip_header=1)
X_dat = dat[:,0]
Y_dat = dat[:,1]
Z_dat = dat[:,2]
C_dat = dat[:,3]
ax1 = fig.add_subplot(111, projection='3d')
for color in np.unique(C_dat):
X, Y, Z, C = np.array([]), np.array([]), np.array([]), np.array([])
for i in range(len(X_dat)):
if C_dat[i]==color:
X = np.append(X,X_dat[i])
Y = np.append(Y,Y_dat[i])
Z = np.append(Z,Z_dat[i])
C = np.append(C,C_dat[i])

xi = np.linspace(X.min(),X.max(),100)
yi = np.linspace(Y.min(),Y.max(),100)

zi = griddata((X, Y), Z, (xi[None,:], yi[:,None]), method='cubic')
ci = griddata((X, Y), C, (xi[None,:], yi[:,None]), method='cubic')

xig, yig = np.meshgrid(xi, yi)
surf = ax1.plot_surface(xig, yig, zi,facecolors=cm.rainbow(ci), alpha = 0.7)

xi = np.linspace(X_dat.min(),X_dat.max(),100)
yi = np.linspace(Y_dat.min(),Y_dat.max(),100)
ci = griddata((X_dat, Y_dat), C_dat, (xi[None,:], yi[:,None]), method='cubic')
m = cm.ScalarMappable(cmap=cm.rainbow)
m.set_array(ci)
col = plt.colorbar(m)
plt.show()

enter image description here(应该有红色平面)

最佳答案

移动线

ax1 = fig.add_subplot(111, projection='3d')

for color in... 循环之外。通过在每次迭代中重新创建轴,您可以隐藏之前创建的曲面


编辑(回答关于颜色图的第二个问题)

您需要normalise你的数据。目前,你的面部颜色在 0 到 0.6 范围内,所以当你将最大值 (0.6) 提供给 cm.rainbow 时,你会得到绿色,而不是红色(因为它期望范围为 0 到 1) .

这是一个修改后的脚本,我认为它可以正常工作。我们使用 Normalise来自 matplotlib.colors 以及根据您的 C_dat 数据确定的 vminvmax。然后,使用 facecolors=cm.rainbow(norm(ci)) 设置表面的颜色。

然后您还想使用 C_dat 中的值设置 ScalarMappable 的数组,因此我们不需要在这里再次使用 griddata

import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import cm
import matplotlib.colors as colors
from mpl_toolkits.mplot3d import Axes3D
import pylab
from scipy.interpolate import griddata

dat = open('ex.csv', 'w')
dat.write('x,y,z,c\n')
for x in range(20):
for y in range(20):
for c in range(0,7):
dat.write(','.join([str(s) for s in [x,y,x+y+c,c/10.0,'\n']]))
dat.close()

fig = matplotlib.pyplot.gcf()
dat = np.genfromtxt('ex.csv', delimiter=',',skip_header=1)
X_dat = dat[:,0]
Y_dat = dat[:,1]
Z_dat = dat[:,2]
C_dat = dat[:,3]

# Create a Normalize instance.
norm = colors.Normalize(vmin=C_dat.min(),vmax=C_dat.max())

ax1 = fig.add_subplot(111, projection='3d')
for color in np.unique(C_dat):
X, Y, Z, C = np.array([]), np.array([]), np.array([]), np.array([])
for i in range(len(X_dat)):
if C_dat[i]==color:
X = np.append(X,X_dat[i])
Y = np.append(Y,Y_dat[i])
Z = np.append(Z,Z_dat[i])
C = np.append(C,C_dat[i])

xi = np.linspace(X.min(),X.max(),100)
yi = np.linspace(Y.min(),Y.max(),100)

zi = griddata((X, Y), Z, (xi[None,:], yi[:,None]), method='cubic')
ci = griddata((X, Y), C, (xi[None,:], yi[:,None]), method='cubic')

xig, yig = np.meshgrid(xi, yi)

# Note the use of norm in the facecolors option
surf = ax1.plot_surface(xig, yig, zi,facecolors=cm.rainbow(norm(ci)), alpha = 0.7)

m = cm.ScalarMappable(cmap=cm.rainbow)
m.set_array(np.unique(C_dat))

col = plt.colorbar(m)

plt.show()

enter image description here

关于python - matplotlib 正确的颜色/颜色条,用于绘制具有不同颜色的多个表面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35569833/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com