Matplotlib - Неправильное перекрытие при построении двух 3D-поверхностей на тех же осях

Я пытаюсь построить две 3D-поверхности на тех же осях в matplotlib с помощью команды plot_surface.

fig = plt.figure()
fig.figsize = fig_size
ax = fig.gca(projection='3d')

surf = ax.plot_surface(X, Y, Exp_Fric_map, alpha = 1, rstride=1, cstride=1, cmap=cm.winter, linewidth=0.5, antialiased=True)
surf = ax.plot_surface(X, Y, Fric_map, alpha = 1, rstride=1, cstride=1, cmap=cm.autumn,linewidth=0.5, antialiased=True)

Проблема заключается в том, что при просмотре графика не всегда правильная поверхность "сверху", например, на графике:

Example plot

в заднем углу (200 Н, 2,5 Гц по осям) сине-зеленая поверхность "сверху", когда на самом деле желто-красный ближе к зрителю. Если я поверну график:

Second example plot

тогда все выглядит нормально, сине-зеленая поверхность находится под желто-красным цветом при 200N и 2,5 Гц (теперь на левой стороне). Я попытался выполнить поиск stackoverflow и Google, но не нашел похожих проблем с решением.

Я использую Python 2.7.3, Numpy 1.6.1 и Matplotlib 1.1.1rc в Linux.

Ответ 1

Это как живопись. который находится на вершине, определяется тем, что вы нарисовали наконец.

Возможно, вы захотите использовать свойство zorder, чтобы сообщить matplotlib, в каком порядке должны быть окрашены поверхности.

Например:

ax.plot_surface(X, Y, Exp_Fric_map, alpha = 1, rstride=1, cstride=1, cmap=cm.winter, linewidth=0.5, antialiased=True, zorder = 0.5)
ax.plot_surface(X, Y, Fric_map, alpha = 1, rstride=1, cstride=1, cmap=cm.autumn,linewidth=0.5, antialiased=True, zorder = 0.3)

Обновление

Я провел несколько тестов, и я считаю, что это ошибка matplotlib при рисовании нескольких поверхностей на одной фигуре. Например, это создало некоторые поверхности, которые не должны существовать в нашем 3D-мире, например:

enter image description here

и я не вижу эффективного решения после попытки. Каузальность - это порядок живописи, как я сказал: matplotlib всегда рисует вещи один за другим. если часть поверхности должна быть сверху, а другая часть должна быть на дне, matplotlib пойдет не так.

Поэтому мое предложение состояло бы в том, чтобы остановить эту проблему, это пустая трата времени, если вы не хотите внести свой вклад в matplotlib. Если это необходимо для вас, я бы посоветовал просто пойти, чтобы найти еще один инструмент построения графика, чтобы закончить вашу работу.

Ответ 2

Это поведение описано в matplotlib FAQ здесь. На той же странице предлагается установить Mayavi, которые работают нормально с 3D-графиками.

  • Его интерфейс очень похож на matplotlib.
  • Основная проблема заключается в том, что все еще сложно установить его на python 3.