Làm thế nào để thiết lập vị trí máy ảnh của Nhật Bản cho các lô 3d bằng python / matplotlib?


134

Tôi đang học cách sử dụng mplot3d để tạo ra các lô dữ liệu 3d đẹp và cho đến nay tôi khá hạnh phúc. Những gì tôi đang cố gắng làm vào lúc này là một hình ảnh động nhỏ của một bề mặt xoay. Với mục đích đó, tôi cần đặt vị trí camera cho trình chiếu 3D. Tôi đoán điều này phải có thể vì một bề mặt có thể được xoay bằng chuột khi sử dụng matplotlib tương tác. Nhưng làm thế nào tôi có thể làm điều này từ một kịch bản? Tôi đã tìm thấy rất nhiều biến đổi trong mpl_toolkits.mplot3d.proj3d nhưng tôi không thể tìm ra cách sử dụng chúng cho mục đích của mình và tôi đã không tìm thấy bất kỳ ví dụ nào cho những gì tôi đang cố gắng thực hiện.


2
Lưu ý bên lề cho những người thắc mắc làm thế nào để xoay tương tác trong máy tính xách tay jupyter: bạn có thể sử dụng%matplotlib notebook
YvesgereY

Ngoài ra, kéo trong khi giữ nút chuột phải sẽ thay đổi khoảng cách camera.
LoMaPh

Đối với loại phép thuật này, tôi sẽ thử mayavi.
Tactopoda

Câu trả lời:


158

Theo "vị trí camera", có vẻ như bạn muốn điều chỉnh độ cao và góc phương vị mà bạn sử dụng để xem cốt truyện 3D. Bạn có thể thiết lập điều này với ax.view_init. Trước tiên, tôi đã sử dụng đoạn mã dưới đây để tạo cốt truyện, sau đó tôi xác định độ cao tốt hoặc elevtừ đó để xem cốt truyện của mình. Sau đó, tôi đã điều chỉnh góc phương vị, hoặc azim, để thay đổi 360deg đầy đủ xung quanh cốt truyện của mình, lưu hình ở mỗi trường hợp (và lưu ý góc phương vị nào khi tôi lưu cốt truyện). Đối với một chảo máy ảnh phức tạp hơn, bạn có thể điều chỉnh cả độ cao và góc để đạt được hiệu ứng mong muốn.

    from mpl_toolkits.mplot3d import Axes3D
    ax = Axes3D(fig)
    ax.scatter(xx,yy,zz, marker='o', s=20, c="goldenrod", alpha=0.6)
    for ii in xrange(0,360,1):
        ax.view_init(elev=10., azim=ii)
        savefig("movie%d.png" % ii)

26
Đánh tôi đi Trên một lưu ý phụ, chúng có sẵn như là ax.elevax.azimcác thuộc tính. Bạn cũng có thể chỉ cần viết ax.azim = iihoặc thậm chí ax.azim += 1để đạt được hiệu quả tương tự.
Joe Kington

1
Xin lỗi tôi đánh bạn nhưng điểm công bằng xung quanh. Đây cũng chỉ là một đoạn trích mã hóa của tôi, có nhiều thứ trong vòng lặp đó hơn là view_init và savefig. =)
vũ trụ

4
Cảm ơn cosmosis và Joe, đó chính xác là những gì tôi đang tìm kiếm. Vì bây giờ tôi đã biết phải tìm gì, tôi cũng tìm thấy ax.dist - cùng với ax.azim và ax.elev - cho phép đặt vị trí camera theo tọa độ cực.
Andreas Bleuler

Nếu đây là câu trả lời - bạn có thể vui lòng đánh dấu nó không? Cảm ơn.
vũ trụ

12
Bạn cũng có thể đặt khoảng cách giữa điểm camera và đối tượng theo ax.dist = 15 (mặc định là 10)
Tim

14

Điều có ích sẽ là áp dụng vị trí Camera cho một âm mưu mới. Vì vậy, tôi vẽ, sau đó di chuyển cốt truyện xung quanh với con chuột thay đổi khoảng cách. Sau đó cố gắng tái tạo chế độ xem bao gồm khoảng cách trên một âm mưu khác. Tôi thấy rằng axx.ax.get_axes () mang lại cho tôi một đối tượng với .azim và .elev cũ.

Ở PYTHON ...

axx=ax1.get_axes()
azm=axx.azim
ele=axx.elev
dst=axx.dist       # ALWAYS GIVES 10
#dst=ax1.axes.dist # ALWAYS GIVES 10
#dst=ax1.dist      # ALWAYS GIVES 10

Biểu đồ 3d sau này ...

ax2.view_init(elev=ele, azim=azm) #Works!
ax2.dist=dst                       # works but always 10 from axx

EDIT 1 ... OK, Vị trí máy ảnh là cách suy nghĩ sai lầm liên quan đến giá trị .dist. Nó cưỡi trên tất cả mọi thứ như một loại số nhân vô hướng hackey cho toàn bộ biểu đồ.

Điều này hoạt động cho độ phóng đại / thu phóng của chế độ xem:

xlm=ax1.get_xlim3d() #These are two tupples
ylm=ax1.get_ylim3d() #we use them in the next
zlm=ax1.get_zlim3d() #graph to reproduce the magnification from mousing
axx=ax1.get_axes()
azm=axx.azim
ele=axx.elev

Đồ thị sau này ...

ax2.view_init(elev=ele, azim=azm) #Reproduce view
ax2.set_xlim3d(xlm[0],xlm[1])     #Reproduce magnification
ax2.set_ylim3d(ylm[0],ylm[1])     #...
ax2.set_zlim3d(zlm[0],zlm[1])     #...

+1 để gọi phép nhân vô hướng hacky. Sẽ rất khó chịu nếu bạn đang hy vọng vào viễn cảnh.
dùng5920660
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.