Я использую текущий код для создания 3D-графика на основе распространенного примера PolyCollection:
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.collections import PolyCollection
from matplotlib.colors import colorConverter
import matplotlib.pyplot as plt
import numpy as np
#plt.xkcd()
fig = plt.figure()
ax = fig.gca(projection='3d')
def cc(arg):
return colorConverter.to_rgba(arg, alpha=0.6)
cap = 0.55 #initial capacity
xs = np.arange(0, 50, 0.02) #Time
verts = []
zs = [0.0, 20.0, 40.0, 60.0, 85.0, 100.0, 125.0] #Temps
ds = [.002, .005, .015, .03, .06, .10, .60] #Discharge rates, percent per year
drain = [190, 212, 230, 285, 460, 600, 700] #Circuit drain in nA
drain = [(d+250) * 1e-9 for d in drain] #Add in 250nA for ADC/etc, convert to A
idx = 0
for z in zs:
ys = cap*((1-ds[idx])**xs) - drain[idx]*xs*8760
ys[0], ys[-1] = 0, 0
ys[ys<0] = np.nan
verts.append(list(zip(xs, ys)))
idx+=1
poly = PolyCollection(verts, facecolors=[cc('b'), cc('teal'), cc('g'),
cc('y'), cc('orange'), cc('red'), cc('salmon')])
poly.set_alpha(0.7)
poly.set_edgecolor('k')
ax.add_collection3d(poly, zs=zs, zdir='x')
ax.set_title('Discharge Curves', loc='center')
ax.set_xlabel('Temperature (C)')
ax.set_xlim3d(0, 125)
ax.set_ylabel('Time (yrs)')
ax.set_ylim3d(0, 50)
ax.set_zlabel('Capacity (mAh)')
ax.set_zlim3d(0, 0.6)
ax.grid(True, lw=1, zorder=0)
plt.show()
В основном все работает нормально, но у меня есть пара проблем.
- Сетки не отображаются в ожидаемых плоскостях (например, x = 0, y = 0, z = 0). Когда отметки «0» для всех трех осей не совпадают в углу или вдоль краев, я сталкиваюсь с некоторыми проблемами параллакса, которые действительно отклоняют перспективу. Как я могу это исправить?
- При определенных углах обзора полигоны будут отображаться в неправильном порядке. Например, чирок будет казаться позади синего цвета, когда он на самом деле впереди. Что вызывает это?
- Включение стиля xkcd приводит к исчезновению линий сетки. Я пытался исправить это безрезультатно. Какая здесь разница? Я знаю, что видел 3D-графики xkcd с линиями сетки - это 3D, что разрушает их?
- Могу ли я изменить расстояние между метками и метками на 3D-графике? Может быть довольно трудно сказать, какая линия сетки соответствует какой температуре.
- Спасибо за внимание!
![Parallax issue (orange curve appears to be at 80C](https://i.stack.imgur.com/f60ce.png)
![Orange curve is actually at 85C](https://i.stack.imgur.com/6sTCX.png)
![enter image description here](https://i.stack.imgur.com/GHq96.png)