Definir o formato do gráfico 3D
Eu estou tentando traçar uma imagem 3D do fundo do mar a partir dos dados de um sonar executado em uma porção de 500m por 40m do fundo do mar. Estou usando o matplotlib / mplot3d com o Axes3D e quero poder alterar a relação de aspecto dos eixos para que o eixo x & y seja dimensionado. Um script de exemplo com dados gerados, em vez dos dados reais, é:
<code>import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Axes3D import numpy as np # Create figure. fig = plt.figure() ax = fig.gca(projection = '3d') # Generate example data. R, Y = np.meshgrid(np.arange(0, 500, 0.5), np.arange(0, 40, 0.5)) z = 0.1 * np.abs(np.sin(R/40) * np.sin(Y/6)) # Plot the data. surf = ax.plot_surface(R, Y, z, cmap=cm.jet, linewidth=0) fig.colorbar(surf) # Set viewpoint. ax.azim = -160 ax.elev = 30 # Label axes. ax.set_xlabel('Along track (m)') ax.set_ylabel('Range (m)') ax.set_zlabel('Height (m)') # Save image. fig.savefig('data.png') </code>
E a imagem de saída deste script:
Agora gostaria de alterá-lo para que 1 metro no eixo longitudinal (x) seja o mesmo que 1 metro no eixo (y) (ou talvez uma relação diferente dependendo dos tamanhos relativos envolvidos). Eu também gostaria de definir a proporção do eixo z, novamente não necessariamente para 1: 1 devido aos tamanhos relativos nos dados, mas o eixo é menor que o gráfico atual.
Eu tentei construir e usareste ramo de matplotlib, seguindo o script de exemplo emesta mensagem da lista de discussão, mas adicionando oax.pbaspect = [1.0, 1.0, 0.25]
linha para o meu script (tendo desinstalado a versão 'padrão' do matplotlib para garantir que a versão personalizada estava sendo usada) não fez nenhuma diferença na imagem gerada.
Editar: Assim, a saída desejada seria algo como a seguinte imagem (grosseiramente editada com o Inkscape). Neste caso, não defini uma proporção de 1: 1 nos eixos x / y porque isso parece ridiculamente fino, mas eu o espalhei de modo que não seja quadrado como na saída original.