2013-05-10 38 views
8

Tôi đã dành vài ngày qua cố gắng tìm cách loại bỏ các lề nhỏ khỏi các trục trong ô 3D. Tôi đã thử ax.margins(0)ax.autoscale_view('tight') và các cách tiếp cận khác, nhưng những lợi nhuận nhỏ này vẫn còn ở đó. Đặc biệt, tôi không thích rằng biểu đồ thanh được nâng lên, tức là, đáy của chúng không ở mức 0 - xem hình ảnh ví dụ.Loại bỏ các mép của trục trong ô 3D

unwanted margins on all axes

Trong gnuplot, tôi sẽ sử dụng "thiết lập xyplane tại 0". Trong matplotlib, vì có các lề trên mỗi trục trên cả hai mặt, sẽ rất tuyệt vời để có thể điều khiển từng trục.

Edit: giải pháp HYRY của dưới đây hoạt động tốt, nhưng trục 'X' được một đường lưới được vẽ trên nó tại Y = 0:

strange axis

+0

Nó thực sự sẽ giúp đỡ nếu bạn có thể thêm mã bạn sử dụng để làm cho cốt truyện, vì vậy chúng tôi có một điểm khởi đầu. Sau đó, mọi người dễ dàng sao chép và dán mã, và sau đó tìm giải pháp cho vấn đề cụ thể này. – hooy

+0

Rất nhiều mã mẫu [ở đây] (http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html) (ví dụ "Sơ đồ khối" tương tự như trường hợp của tôi ở trên). – dolphin

Trả lời

6

Không có tài sản hoặc phương pháp có thể sửa đổi các lề này. Bạn cần vá mã nguồn. Dưới đây là một ví dụ:

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import numpy as np 
###patch start### 
from mpl_toolkits.mplot3d.axis3d import Axis 
if not hasattr(Axis, "_get_coord_info_old"): 
    def _get_coord_info_new(self, renderer): 
     mins, maxs, centers, deltas, tc, highs = self._get_coord_info_old(renderer) 
     mins += deltas/4 
     maxs -= deltas/4 
     return mins, maxs, centers, deltas, tc, highs 
    Axis._get_coord_info_old = Axis._get_coord_info 
    Axis._get_coord_info = _get_coord_info_new 
###patch end### 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
for c, z in zip(['r', 'g', 'b', 'y'], [30, 20, 10, 0]): 
    xs = np.arange(20) 
    ys = np.random.rand(20) 

    # You can provide either a single color or an array. To demonstrate this, 
    # the first bar of each set will be colored cyan. 
    cs = [c] * len(xs) 
    cs[0] = 'c' 
    ax.bar(xs, ys, zs=z, zdir='y', color=cs, alpha=0.8) 

ax.set_xlabel('X') 
ax.set_ylabel('Y') 
ax.set_zlabel('Z') 

plt.show() 

Kết quả là:

enter image description here

Sửa

Để thay đổi màu sắc của các đường lưới:

for axis in (ax.xaxis, ax.yaxis, ax.zaxis): 
    axis._axinfo['grid']['color'] = 0.7, 1.0, 0.7, 1.0 

Edi t2

Set X & Y lim:

ax.set_ylim3d(-1, 31) 
ax.set_xlim3d(-1, 21) 
+0

Cảm ơn bạn, nó đã làm việc ... (1) nếu tôi thay đổi 'cho c, z trong zip (['r', 'g', 'b', 'y'], [30, 20, 10, 2]) ', tại sao trục 'X' lại có kiểu đường nét đứt quãng dày? (2) Làm thế nào để thay đổi màu sắc của các đường lưới? 'ax.grid (color = 'blue')' không hoạt động. – dolphin

+0

@dolphin, bạn có thể đăng kết quả của (1) không? Đối với (2), màu sắc không thể được sửa đổi bởi một số API, tôi đã thêm mã đã thay đổi dict _axinfo ẩn. – HYRY

+0

Cảm ơn vì (2)! Đó là một sự xấu hổ rằng sự phức tạp và tính linh hoạt của matplotlib dẫn đến rất nhiều "hack" mà cần phải được tìm kiếm riêng lẻ, và các giải pháp trực quan đôi khi làm việc, đôi khi không.Về (1), tôi không thể gửi một hình ảnh trong một bình luận vì vậy tôi dán một đoạn mã hy vọng rằng bạn có thể tái tạo nó :-) Bây giờ tôi đã thêm một hình ảnh như là một chỉnh sửa trong câu hỏi ban đầu. – dolphin

0

tôi phải tinh chỉnh các giải pháp chấp nhận một chút, bởi vì trong trường hợp của tôi x và y trục (nhưng không phải là z) đã có một lề bổ sung, trong đó, bằng cách in mins, maxs, deltas, hóa ra là deltas * 6.0/11. Đây là bản vá cập nhật hoạt động tốt trong trường hợp của tôi.

###patch start### 
from mpl_toolkits.mplot3d.axis3d import Axis 
def _get_coord_info_new(self, renderer): 
    mins, maxs, cs, deltas, tc, highs = self._get_coord_info_old(renderer) 
    correction = deltas * [1.0/4 + 6.0/11, 
          1.0/4 + 6.0/11, 
          1.0/4] 
    mins += correction 
    maxs -= correction 
    return mins, maxs, cs, deltas, tc, highs 
if not hasattr(Axis, "_get_coord_info_old"): 
    Axis._get_coord_info_old = Axis._get_coord_info 
Axis._get_coord_info = _get_coord_info_new 
###patch end### 

(Tôi cũng đã thay đổi logic vá xung quanh một chút, vì vậy rằng việc chỉnh sửa các chức năng và nạp lại mô-đun của nó bây giờ công trình như mong đợi trong Jupyter.)

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