Построение графика поверхности mplot3d / axes3D xyz с логарифмическим масштабом? - PullRequest
9 голосов
/ 12 октября 2010

Я искал решение этой простой проблемы, но нигде не могу его найти!Есть множество постов, подробно описывающих построение полулога / журнала событий в 2D, например, plt.setxscale ('log'), однако меня интересует использование масштабов журнала на 3D графике (mplot3d).

Я не знаюУ нас нет точного кода, поэтому вы не можете опубликовать его здесь, однако простого примера, приведенного ниже, должно быть достаточно, чтобы объяснить ситуацию.В настоящее время я использую Matplotlib 0.99.1, но вскоре должен будет обновиться до 1.0.0 - я знаю, что мне придется обновить мой код для реализации mplot3d.

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-5, 5, 0.025)
Y = np.arange(-5, 5, 0.025)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet, extend3d=True)
ax.set_zlim3d(-1.01, 1.01)

ax.w_zaxis.set_major_locator(LinearLocator(10))
ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f'))

fig.colorbar(surf)

plt.show()

Приведенный выше код будет хорошо отображаться в3D, однако все три шкалы (X, Y, Z) являются линейными.Мои данные «Y» охватывают несколько порядков (например, 9!), Поэтому было бы очень полезно построить их в логарифмическом масштабе.Я могу обойти эту проблему, взяв журнал 'Y', воссоздав массив numpy и построив график (Y) в линейном масштабе, но в истинном стиле Python я ищу более разумное решение, которое будет отображать данные налогарифмическая шкала.

Можно ли создать трехмерный график поверхности моих данных XYZ с использованием логарифмических масштабов, в идеале я хотел бы, чтобы X и Z были в линейных масштабах, а Y - в логарифмическом масштабе?

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

Спасибо

Ответы [ 4 ]

11 голосов
/ 28 июня 2013

Поскольку я столкнулся с тем же вопросом, и ответ Алехандроса не дал желаемых результатов, вот что я обнаружил до сих пор.

Масштабирование журнала для осей в 3D - это постоянная проблема в matplotlib.В настоящее время вы можете перемаркировать оси только с:

ax.yaxis.set_scale('log')

Это, однако, не приведет к тому, что оси будут масштабированы логарифмически, но помечены как логарифмические.ax.set_yscale('log') вызовет исключение в 3D

См. На github выпуск 209

Поэтому вам все равно придется воссоздать массив numpy

3 голосов
/ 25 апреля 2013

Все, что вам нужно сделать, это определить масштаб оси, которую вы хотите.Например, если вы хотите, чтобы оси x и y находились в логарифмическом масштабе, вы должны написать:

ax.xaxis.set_scale('log')
ax.yaxis.set_scale('log')

и в конечном итоге:

ax.zaxis.set_scale('log')
2 голосов
/ 11 октября 2017

в osx: run ax.zaxis._set_scale ('log') (обратите внимание на подчеркивание)

0 голосов
/ 24 мая 2018

Нет решения из-за проблемы 209. Однако вы можете попробовать сделать это:

ax.plot_surface(X, np.log10(Y), Z, cmap='jet', linewidth=0.5)

Если в «Y» есть 0, то появится предупреждение, но оно все еще работает. Из-за этого предупреждения цветные карты не работают, поэтому старайтесь избегать 0 и отрицательных чисел. Например:

   Y[Y != 0] = np.log10(Y[Y != 0])
ax.plot_surface(X, Y, Z, cmap='jet', linewidth=0.5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...