Python matplotlib -> gráfico de barras 3D -> ajustando a posição do rótulo do tick, barras transparentes
-
12-11-2019 - |
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:
- Exibindo os rótulos dos eixos corretamente (atualmente faltam os rótulos finais (ou iniciais?))
- 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.
- Tornando as barras semitransparentes.
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()
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: