2012-02-24 30 views
5

Tôi đang cố gắng tạo biểu đồ thanh 3D bằng Python sử dụng bar3d() trong Matplotlib.Python matplotlib -> Ô nhịp 3D -> điều chỉnh vị trí nhãn đánh dấu, thanh trong suốt

Tôi đã nhận được đến điểm nơi tôi có thể hiển thị biểu đồ của tôi trên màn hình sau khi đi qua nó một số dữ liệu, nhưng tôi bị mắc kẹt trên như sau:

  1. trục Hiển thị nhãn đúng (hiện bỏ sót cuối cùng (hoặc ban đầu?) đánh dấu nhãn)
  2. Hoặc làm cho các dấu trên mỗi trục (ví dụ như cho 'Mon') hoặc trỏ đến thanh màu xanh tương ứng của nó, hoặc vị trí nhãn đánh dấu giữa các dấu tick chính.
  3. Làm cho các thanh bán trong suốt.

image of plot uploaded here

Tôi đã thử qua các đối số khác nhau để các 'rìu' dụ, nhưng đã không nhận được bất cứ điều gì để làm việc bất chấp và nghi ngờ tôi đã hiểu lầm những gì để cung cấp cho nó với. Tôi sẽ rất biết ơn vì bất kỳ sự giúp đỡ nào về điều này.

Dưới đây là một mẫu mã tôi đang làm việc trên:

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() 

Trả lời

7

Để thực hiện thanh bán trong suốt, bạn chỉ cần sử dụng tham số alpha. alpha = 0 nghĩa là 100% trong suốt, trong khi alpha = 1 (mặc định) có nghĩa là 0% trong suốt.

Hãy thử điều này, nó sẽ làm việc ra để làm cho các thanh bán trong suốt:

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

Về vị trí ve, bạn có thể làm điều đó bằng một cái gì đó như thế này (danh sách đầu tiên trên plt.xticks hoặc plt. yticks chứa "giá trị", nơi nào bạn muốn xác định vị trí ve, và danh sách thứ hai chứa những gì bạn thực sự muốn gọi ve):

#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) 

cuối cùng, tôi nhận được con số này: enter image description here

+0

Xin chào, cảm ơn đề xuất của bạn. Tôi đã cố gắng sử dụng các tham số alpha, nhưng nhận được lỗi sau: 'File "matrix_to_3D_histogram.py", dòng 43, trong ax.bar3d (xpos, ypos, zpos, dx, dy, dz, color =' b ', alpha = 0.5) TypeError: bar3d() nhận đối số từ khóa không mong muốn' alpha'' – Dman

+0

Thật kỳ lạ, tôi hoàn toàn không gặp vấn đề gì và tôi chỉ sao chép mã của bạn và thay đổi dòng tôi đã nói với bạn. Bạn đang sử dụng phiên bản nào? Tôi đang sử dụng matplotlib 1.1.0. – carla

+0

@Dan để kiểm tra phiên bản của loại matplotlib này: 'import matplotlib; print matplotlib .__ version__' – Hooked

Các vấn đề liên quan