Ste*_*man 4 matplotlib python-3.x mplot3d
我正在尝试绘制一个像这样的 3D 图表:
使用此代码并收到一条错误消息:
line 1621, in plot_surface
if Z.ndim != 2:
AttributeError: 'list' object has no attribute 'ndim'
Run Code Online (Sandbox Code Playgroud)
import cobra
import os
from os.path import join
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
data_dir ='/Users/stephenchapman/Documents/research/FBA_algae_digesate/COBRApy/iCZ843/iCZ843_models'
model = cobra.io.read_sbml_model(join(data_dir, "iCZ843_hetero.xml"))
model.reactions[15].upper_bound = -0 #ammonia
model.reactions[15].lower_bound = -98.3
model.reactions[27].upper_bound = -0 #acetate
model.reactions[27].lower_bound = -3.3
model.reactions[14].upper_bound = -0 #phosphate
model.reactions[14].lower_bound = -10
model.reactions[16].upper_bound = -0 #nitrate
model.reactions[16].lower_bound = -30.3
model.reactions[20].upper_bound = -0 #magnesium
model.reactions[20].lower_bound = -0.56
model.reactions[18].upper_bound = -0 #iron
model.reactions[18].lower_bound = -2.16
model.objective = model.reactions[63]
solution = model.optimize()
model.summary()
ac_uptake = []
NH4_uptake = []
growth_rate = []
for i in range(0,85,5):
model.reactions[27].lower_bound = -i #acetate uptake
model.reactions[27].upper_bound = -i
for j in (0,80,5):
model.reactions[15].lower_bound = -i #NH4 uptake
model.reactions[15].upper_bound = -i
print(solution.f)
growth_rate.append(solution.f)
ac_uptake.append(model.reactions[27].lower_bound)
NH4_uptake.append(model.reactions[15].lower_bound)
plot_ac_uptake = list(range(0,85,5))
plot_NH4_uptake = list(range(0,85,5))
X = (plot_ac_uptake)
Y = (plot_NH4_uptake)
X, Y = np.meshgrid(X, Y)
Z = (growth_rate)
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.viridis)
plt.show()
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?
错误信息
Z.ndim != 2:
AttributeError: 'list' object has no attribute 'ndim'
Run Code Online (Sandbox Code Playgroud)
是说该列表Z没有属性ndim。
ndim然而,是NumPy arrays 的一个属性。因此,转换为 NumPy 数组很可能Z会解决问题(或者至少让您通过AttributeError):
Z = np.array(Z)
Run Code Online (Sandbox Code Playgroud)
例如,
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
X = list(np.linspace(-4, 4, 100))
Y = list(np.linspace(-4, 4, 100))
X, Y = np.meshgrid(X, Y)
Z = np.sin((X**2 + Y**2)/4)
# Z = (np.sin((X**2 + Y**2)/4)).tolist()
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.viridis)
plt.show()
Run Code Online (Sandbox Code Playgroud)
工作正常,但如果你取消注释该行
Z = (np.sin((X**2 + Y**2)/4)).tolist()
Run Code Online (Sandbox Code Playgroud)
这会生成Z一个列表列表,然后您会收到错误消息
Z.ndim != 2:
AttributeError: 'list' object has no attribute 'ndim'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11126 次 |
| 最近记录: |