python-3.x - matplotlib 0.99 Mplot3d AttributeError:“列表”对象没有属性“ndim”
问题描述
我正在尝试在这里绘制一个像这样的 3d 图:
使用此代码并收到一条错误消息:
line 1621, in plot_surface
if Z.ndim != 2:
AttributeError: 'list' object has no attribute 'ndim'
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()
谁能帮帮我?
解决方案
错误信息
Z.ndim != 2:
AttributeError: 'list' object has no attribute 'ndim'
是说列表Z
没有属性ndim
。
然而,它是 NumPy 数组ndim
的一个属性。因此,转换为 NumPy 数组很可能会解决问题(或至少让您通过):Z
AttributeError
Z = np.array(Z)
例如,
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()
工作正常,但如果你取消注释该行
Z = (np.sin((X**2 + Y**2)/4)).tolist()
Z
生成列表列表,然后您会收到错误消息
Z.ndim != 2:
AttributeError: 'list' object has no attribute 'ndim'
推荐阅读
- .net - 在 Winform 应用程序中使用 Matlab 生成的 .Net 程序集
- php - jQuery 中的 bloginfo('template_directory') 用于管理面板
- ecmascript-6 - 使用 Node Rollup 如何生成 ES2015 输出
- html - 引导工具提示
- jquery - 如何防止 JQuery 中的第二次点击?
- sql - 我可以在外键列中添加非原子值吗?
- javascript - 将所有访问者浏览器信息保存到会话中不起作用
- python - NameError: __file__ 未定义
- cakephp-3.0 - 如果满足条件,如何初始化数据库中的表对象?蛋糕PHP
- reactjs - 为什么 react 异步接收 redux 状态的更新