2013-07-29 38 views
8

Tôi đang sẵn sàng cho bản trình bày và tôi có một số ví dụ về số liệu matplotlib 3D. Tuy nhiên, các đường lưới là quá nhẹ để xem trên các hình ảnh chiếu. example 3D imageĐiều chỉnh đường lưới trên hình 3D Matplotlib

tôi đã cố gắng sử dụng lưới phương pháp mà làm việc cho nhân vật 2D:

points = (5*np.random.randn(3, 50)+np.tile(np.arange(1,51), (3, 1))).transpose() 
fig = plt.figure(figsize = (10,10)) 
ax = fig.add_subplot(111, projection='3d') 
ax.scatter(points[:,0], points[:,1], points[:,2]) 
ax.view_init(elev=0., azim=0) 
ax.set_ylim([0, 60]) 
ax.set_zlim([0, 60]) 
ax.set_xlim([0, 60]) 
ax.set_zlabel('Cytokine') 
ax.set_ylabel('Parameter') 
ax.grid(linewidth=20) 

Nhưng điều đó dường như không làm việc cho nhân vật 3D. Bất kỳ đề xuất?

Trả lời

3

Rất tiếc, điều này dường như không bị lộ. Nhìn qua nguồn, biến nội bộ chính là gọi _AXINFO mà chúng ta có thể ghi đè bằng cách phân lớp cẩn thận.

enter image description here

Thêm mã này sau khi con số của bạn được tạo ra, và phong cách nó với dict custom_AXINFO:

from mpl_toolkits.mplot3d import Axes3D 
import mpl_toolkits.mplot3d.axis3d as axis3d 

# New axis settings 
custom_AXINFO = { 
    'x': {'i': 0, 'tickdir': 1, 'juggled': (1, 0, 2), 
      'color': (0.00, 0.00, 0.25, .75)}, 
    'y': {'i': 1, 'tickdir': 0, 'juggled': (0, 1, 2), 
      'color': (0.20, 0.90, 0.90, 0.25)}, 
    'z': {'i': 2, 'tickdir': 0, 'juggled': (0, 2, 1), 
      'color': (0.925, 0.125, 0.90, 0.25)},} 

class custom_XAxis(axis3d.Axis): 
    _AXINFO = custom_AXINFO 

class custom_YAxis(axis3d.Axis): 
    _AXINFO = custom_AXINFO 

class custom_ZAxis(axis3d.Axis): 
    _AXINFO = custom_AXINFO 

class custom_Axes3D(Axes3D): 
    def _init_axis(self): 
     '''Init 3D axes; overrides creation of regular X/Y axes''' 
     self.w_xaxis = custom_XAxis('x', self.xy_viewLim.intervalx, 
            self.xy_dataLim.intervalx, self) 
     self.xaxis = self.w_xaxis 
     self.w_yaxis = custom_YAxis('y', self.xy_viewLim.intervaly, 
          self.xy_dataLim.intervaly, self) 
     self.yaxis = self.w_yaxis 
     self.w_zaxis = custom_ZAxis('z', self.zz_viewLim.intervalx, 
          self.zz_dataLim.intervalx, self) 
     self.zaxis = self.w_zaxis 

     for ax in self.xaxis, self.yaxis, self.zaxis: 
      ax.init3d() 

# The rest of your code below, note the call to our new custom_Axes3D 

points = (5*np.random.randn(3, 50)+np.tile(np.arange(1,51), (3, 1))).transpose() 
fig = plt.figure(figsize = (10,10)) 
ax = custom_Axes3D(fig) 

này được khỉ vá lúc đó là tồi tệ nhất, và không nên được dựa vào để làm việc cho các phiên bản sau.

Sửa các facecolors dễ dàng hơn các đường lưới, vì điều này đòi hỏi phải ghi đè lên một trong các phương pháp __init__, mặc dù nó có thể được thực hiện với nhiều công việc hơn.

Dường như không khó để hiển thị điều này cho người dùng cuối và vì vậy tôi có thể hình dung rằng điều này có thể được khắc phục trong các phiên bản sau.

+0

Có vẻ như bây giờ bạn có thể làm ax.w_xaxis.plane.set_color ((1,0,0)); ax.w_xaxis.plane.set_alpha (0.5). Có vẻ như nó bỏ qua kênh alpha trong set_color nhưng sử dụng kênh alpha trong set_alpha. – Ben

16

Nếu bạn không nhớ có tất cả các dòng dày hơn thì bạn có thể điều chỉnh cài đặt rc mặc định.

Cho một đồ thị như:

enter image description here

Chúng ta có thể thêm:

import matplotlib as mpl 
mpl.rcParams['lines.linewidth'] = 2 

Để tăng độ rộng dòng mặc định của tất cả các dòng, đưa ra một kết quả của:

enter image description here

thay thế atively, nếu bạn cảm thấy điều này có vẻ xấu xí, bạn có thể sử dụng:

ax.w_xaxis.gridlines.set_lw(3.0) 
ax.w_yaxis.gridlines.set_lw(3.0) 
ax.w_zaxis.gridlines.set_lw(3.0) 

để điều chỉnh độ rộng dòng của mỗi trục đến 3.0, sản xuất:

enter image description here

Để cập nhật màu sắc, vì vậy lưới điện-đường thực sự bật, bạn có thể thêm:

ax.w_xaxis._axinfo.update({'grid' : {'color': (0, 0, 0, 1)}}) 
ax.w_yaxis._axinfo.update({'grid' : {'color': (0, 0, 0, 1)}}) 
ax.w_zaxis._axinfo.update({'grid' : {'color': (0, 0, 0, 1)}}) 

nào sản xuất:

enter image description here

Phương pháp này khá khó hiểu, nhưng theo tôi biết không có cách nào đơn giản hơn để đạt được những kết quả này !! Hi vọng điêu nay co ich; cho tôi biết nếu bạn cần thêm bất kỳ trợ giúp nào!

+0

@JudoWill - bạn nên chấp nhận câu trả lời này nếu nó khắc phục được sự cố của bạn! – Jamie

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