Python matplotlib -> gráfico de barras 3D -> ajustando a posição do rótulo do tick, barras transparentes

StackOverflow https://stackoverflow.com/questions/9433240

Pergunta

Estou tentando criar um histograma de barras 3D em Python usando bar3d() no Matplotlib.

Cheguei ao ponto em que posso exibir meu histograma na tela depois de passar alguns dados, mas estou preso no seguinte:

  1. Exibindo os rótulos dos eixos corretamente (atualmente faltam os rótulos finais (ou iniciais?))
  2. Fazendo as marcações em cada eixo (por exemplo,isso para 'Mon') aponte para a barra azul correspondente ou posicione o rótulo entre as marcas principais.
  3. Tornando as barras semitransparentes.

imagem do enredo enviada aqui

Tentei passar vários argumentos diferentes para a instância 'ax', mas não consegui nada para funcionar e suspeito que não entendi o que fornecer.Ficarei muito grato por qualquer ajuda nisso.

Aqui está um exemplo do código em que estou trabalhando:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

#from IPython.Shell import IPShellEmbed
#sh = IPShellEmbed()

data = np.array([
[0,1,0,2,0],
[0,3,0,2,0],
[6,1,1,7,0],
[0,5,0,2,9],
[0,1,0,4,0],
[9,1,3,4,2],
[0,0,2,1,3],
])

column_names = ['a','b','c','d','e']
row_names = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun']

fig = plt.figure()
ax = Axes3D(fig)

lx= len(data[0])            # Work out matrix dimensions
ly= len(data[:,0])
xpos = np.arange(0,lx,1)    # Set up a mesh of positions
ypos = np.arange(0,ly,1)
xpos, ypos = np.meshgrid(xpos+0.25, ypos+0.25)

xpos = xpos.flatten()   # Convert positions to 1D array
ypos = ypos.flatten()
zpos = np.zeros(lx*ly)

dx = 0.5 * np.ones_like(zpos)
dy = dx.copy()
dz = data.flatten()

ax.bar3d(xpos,ypos,zpos, dx, dy, dz, color='b')

#sh()
ax.w_xaxis.set_ticklabels(column_names)
ax.w_yaxis.set_ticklabels(row_names)
ax.set_xlabel('Letter')
ax.set_ylabel('Day')
ax.set_zlabel('Occurrence')

plt.show()
Foi útil?

Solução

Para tornar as barras semitransparentes, basta usar o parâmetro alfa.alfa=0 significa 100% transparente, enquanto alfa=1 (o padrão) significa 0% transparente.

Tente isso, vai funcionar para deixar as barras semitransparentes:

ax.bar3d(xpos,ypos,zpos, dx, dy, dz, color='b', alpha=0.5)

Em relação à localização dos ticks, você pode fazer isso usando algo assim (a primeira lista em plt.xticks ou plt.yticks contém os "valores" onde você deseja localizar os ticks, e a segunda lista contém o que você realmente deseja chamar os carrapatos):

#ax.w_xaxis.set_ticklabels(column_names)
#ax.w_yaxis.set_ticklabels(row_names)

ticksx = np.arange(0.5, 5, 1)
plt.xticks(ticksx, column_names)

ticksy = np.arange(0.6, 7, 1)
plt.yticks(ticksy, row_names)

No final, recebo este número:enter image description here

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top