2013-09-02 48 views
5

Tôi cần một hình trong matplotlib trong đó cả hai trục đều có cùng chiều dài. Đối với điều này tôi đang sử dụng tùy chọn 'bình đẳng'. Trong hầu hết các trường hợp, nó hoạt động khá tốt và tôi nhận được kết quả mong đợi (xem hình 1), nhưng khi các giá trị của trục y cao hơn nhiều so với x, hình này cho thấy một hành vi không mong muốn (xem hình 2). Có ai biết hành vi này của matplotlib?matplotlib axes.set_aspect ('bằng') không hoạt động như mong đợi

Danke, Jörg

 host = SubplotHost(fig, 111) 
     try: 
      min_x_val = min(x for x in self.x_values if x is not None) 
      max_x_val = max(self.x_values) 
     except ValueError: 
      return 

     max_y_val = list() 
     for n, evaluator in enumerate(self.cleaned_evaluators): 
      max_y_val.append(max(self.y_values[n])) 

     # axis settings 
     host.axis['left'].label.set_fontsize('small') 
     host.axis['left'].major_ticklabels.set_fontsize('small') 
     host.axis['bottom'].label.set_fontsize('small') 
     host.axis['bottom'].major_ticklabels.set_fontsize('small') 
     host.axis['bottom'].major_ticklabels.set_rotation(0) 
     host.set_ylabel(y_label) 
     host.set_xlabel(x_label) 


     host.set_xlim(0, max_x_val) 
     host.set_ylim(0, max_y_val) 

     host.minorticks_on() 
     host.toggle_axisline(False) 
     host.axes.set_aspect('equal') 
     host.grid(True, alpha=0.4) 

     return fig 

Hình 1:

When it works

Hình 2:

When it doesn't work

+3

Thực tế nó hoạt động như mong đợi.'set_aspect ('bằng') 'có nghĩa là một đơn vị trên trục x có cùng độ dài với một đơn vị trên y-axis, như trong Hình 1. – hooy

+0

Bạn có thể chuyển một giá trị số tới 'set_aspect', xem [documentation] (http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.set_aspect). Lấy thương của 'x' và' y' bạn sẽ có thể mở rộng các trục sao cho chúng có cùng chiều dài. – Bakuriu

+0

Lưu ý rằng ví dụ đầu tiên của bạn (Hình 1) không thực sự là hình vuông; nó rộng khoảng 430 pixel, cao 400 điểm ảnh. Điều này phù hợp với các phạm vi dữ liệu hơi khác nhau cho hai trục (0 đến 3,5 đối với trục x, 0 đến 3,25 cho trục y), vì 'set_aspect ('bằng')' đang buộc cùng một tỷ lệ dữ liệu (dữ liệu giá trị cho mỗi pixel) cho cả hai trục. –

Trả lời

11

equal có nghĩa là x và kích thước y đều giống nhau l ength trong tọa độ dữ liệu. Để có được trục vuông, bạn có thể đặt theo cách thủ công tỷ lệ khung hình:

ax.set_aspect(1./ax.get_data_ratio()) 
+1

Lưu ý rằng lệnh này phải xuất hiện ** sau ** lệnh cốt truyện. – Peaceful

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