2013-04-17 34 views
6

Tôi đang cố gắng tìm hiểu cách đặt/sửa vị trí của nhãn đánh dấu cho một âm mưu matplotlib 3D. Đánh dấu nhãn không phù hợp với bọ ve. Vấn đề có vẻ đặc biệt nổi bật khi cần nhiều nhãn đánh dấu.đánh dấu vị trí nhãn cho âm mưu 3D matplotlib

Tôi đã sửa đổi một ví dụ (http://matplotlib.org/examples/mplot3d/polys3d_demo.html) từ tài liệu matplotlib để minh họa cho câu hỏi của tôi.

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.collections import PolyCollection 
from matplotlib.colors import colorConverter 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure(figsize=(10,10)) 
ax = fig.gca(projection='3d') 

cc = lambda arg: colorConverter.to_rgba(arg, alpha=0.6) 

xs = np.arange(0, 10, 0.4) 
verts = [] 
zs = np.arange(50) 
for z in zs: 
    ys = np.ones(len(xs))*z 
    ys[0], ys[-1] = 0, 0 
    verts.append(list(zip(xs, ys))) 

poly = PolyCollection(verts,facecolor='c') 
poly.set_alpha(0.7) 
ax.add_collection3d(poly, zs=zs, zdir='y') 

ax.set_xlabel('X') 
ax.set_xlim3d(0, 10) 
ax.set_ylabel('Y') 
ax.set_ylim3d(-1, len(zs)) 
ax.set_yticks(np.arange(len(zs))) 
labels = {} 
for l_c in zs: 
    labels[l_c] = 'This Looks Bad' 
ax.set_yticklabels(labels,rotation=-15) 
ax.set_zlabel('Z') 
ax.set_zlim3d(0, ys.max()) 

plt.show() 

enter image description here

Vậy câu hỏi là: làm thế nào tôi có thể nhận các nhãn đánh dấu để phù hợp với các vị trí đánh dấu?

Trả lời

5

Chúng phù hợp, nhưng với vị trí nằm ngang ở giữa dấu tích. Vì chế độ xem 3D này khiến chúng xuất hiện một chút bên dưới nơi bạn mong đợi. Hiệu ứng không liên quan đến số lượng bọ ve mà là chiều rộng.

Đặt cụ thể căn chỉnh sẽ giúp ích. Hãy thử thêm:

ax.set_yticklabels(labels,rotation=-15, va='center', ha='left') 

Phát xung quanh một chút với các căn chỉnh khác nhau để xem bạn thích, tôi nghĩ bạn sau ha = 'trái'.

Giảm đệm, khoảng cách từ dấu tích, cũng có thể hữu ích.

enter image description here

+1

Như một lưu ý cho OP: 'va' là đồng nhất với' verticalalignment' như trong ví dụ của tôi. Điều tương tự cũng giữ cho 'ha' và' horizontalalignment'. – Hooked

+0

Có, cảm ơn vì đã làm rõ điều đó, các chữ viết tắt là hạnh phúc khi gõ chúng rất nhiều. :) –

+0

Cảm ơn @Rutger. Tôi đoán đây là điều tốt nhất có thể làm được. Tôi đã chơi đùa với những thứ này (ha, va) và gần như có được thứ tôi muốn. Nó hoạt động tốt hơn trên ví dụ đồ chơi này hơn là vấn đề thực tế mà tôi đang cố giải quyết. Bạn có thể đưa ra một ví dụ về làm thế nào để giảm padding? Có thể thêm vào câu trả lời hiện có của bạn. –

10

Bằng cách sử dụng những sắp xếp, tôi nhận được vị trí tốt hơn nhiều:

ax.set_yticklabels(labels,rotation=-15, 
        verticalalignment='baseline', 
        horizontalalignment='left') 

Tôi đã sửa đổi ví dụ với các đánh dấu tick ít, do đó bạn có thể thấy các vị trí:

enter image description here

+0

Cảm ơn @Hooked. Vấn đề là tôi cần phải có tất cả các nhãn đánh dấu ở đó (có ít nhất 50), vì vậy việc sử dụng các dấu đánh dấu ít hơn không phải là một lựa chọn. Sự lệch hướng là nổi bật hơn với nhiều nhãn hơn. Ngay cả khi sử dụng các biến thể của giải pháp của bạn (và của @Rutgers), các nhãn không được căn chỉnh. –

+0

@ random.me Bạn luôn có thể giảm kích thước phông chữ của nhãn, nhưng bạn vẫn có vấn đề cơ bản của hai văn bản và không gian quá ít! – Hooked

+0

@ random.me Bạn có cần _ticks_ hoặc _text_ không? – tacaswell

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