2014-11-02 17 views
15

Hãy nhìn vào biểu đồ dưới đây: enter image description hereMatplotlib nhãn cho thấy x-đánh dấu chồng chéo bất chấp những nỗ lực tốt nhất

Đó là một âm mưu phụ của con số lớn hơn này: enter image description here

tôi thấy hai vấn đề với nó. Đầu tiên, các nhãn trục x chồng lên nhau (đây là vấn đề chính của tôi). Thứ hai. vị trí của các đường lưới nhỏ trục x có vẻ hơi sôi nổi. Ở bên trái của biểu đồ, chúng trông đúng cách. Nhưng ở bên phải, chúng dường như đang dồn vào các đường lưới chính ... như thể các vị trí đường lưới chính không phải là bội số thích hợp của các vị trí đánh dấu nhỏ.

Thiết lập của tôi là tôi có DataFrame được gọi là df trong đó có DatetimeIndex trên các hàng và cột được gọi là value có chứa phao. Tôi có thể cung cấp ví dụ về nội dung df trong một ý chính nếu cần. Một tá hoặc nhiều dòng df nằm ở cuối bài đăng này để tham khảo.

Dưới đây là đoạn code mà tạo ra con số:

now = dt.datetime.now() 

fig, axes = plt.subplots(2, 2, figsize=(15, 8), dpi=200) 
for i, d in enumerate([360, 30, 7, 1]): 
    ax = axes.flatten()[i] 
    earlycut = now - relativedelta(days=d) 
    data = df.loc[df.index>=earlycut, :] 
    ax.plot(data.index, data['value']) 
    ax.xaxis_date() 

    ax.get_xaxis().set_minor_locator(mpl.ticker.AutoMinorLocator()) 
    ax.get_yaxis().set_minor_locator(mpl.ticker.AutoMinorLocator()) 

    ax.grid(b=True, which='major', color='w', linewidth=1.5) 
    ax.grid(b=True, which='minor', color='w', linewidth=0.75) 

lựa chọn tốt nhất của tôi ở đây để có được những nhãn trục x để ngăn chặn chồng chéo lẫn nhau (trong mỗi trong bốn ô phụ) là gì? Ngoài ra, riêng biệt (nhưng ít khẩn trương hơn), có chuyện gì với vấn đề đánh dấu nhỏ ở tiểu điểm trên cùng bên trái?

Tôi ở trên Pandas 0.13.1, numpy 1.8.0 và matplotlib 1.4.x.

Dưới đây là một đoạn nhỏ của df để tham khảo:

        id scale tempseries_id value 
timestamp               
2014-11-02 14:45:10.302204+00:00 7564  F    1 68.0000 
2014-11-02 14:25:13.532391+00:00 7563  F    1 68.5616 
2014-11-02 14:15:12.102229+00:00 7562  F    1 68.9000 
2014-11-02 14:05:13.252371+00:00 7561  F    1 69.0116 
2014-11-02 13:55:11.792191+00:00 7560  F    1 68.7866 
2014-11-02 13:45:10.782227+00:00 7559  F    1 68.6750 
2014-11-02 13:35:10.972248+00:00 7558  F    1 68.4500 
2014-11-02 13:25:10.362213+00:00 7557  F    1 68.1116 
2014-11-02 13:15:10.822247+00:00 7556  F    1 68.2250 
2014-11-02 13:05:10.102200+00:00 7555  F    1 68.5616 
2014-11-02 12:55:10.292217+00:00 7554  F    1 69.0116 
2014-11-02 12:45:10.382226+00:00 7553  F    1 69.3500 
2014-11-02 12:35:10.642245+00:00 7552  F    1 69.2366 
2014-11-02 12:25:12.642255+00:00 7551  F    1 69.1250 
2014-11-02 12:15:11.122382+00:00 7550  F    1 68.7866 
2014-11-02 12:05:11.332224+00:00 7549  F    1 68.5616 
2014-11-02 11:55:11.662311+00:00 7548  F    1 68.2250 
2014-11-02 11:45:11.122193+00:00 7547  F    1 68.4500 
2014-11-02 11:35:11.162271+00:00 7546  F    1 68.7866 
2014-11-02 11:25:12.102211+00:00 7545  F    1 69.2366 
2014-11-02 11:15:10.422226+00:00 7544  F    1 69.4616 
2014-11-02 11:05:11.412216+00:00 7543  F    1 69.3500 
2014-11-02 10:55:10.772212+00:00 7542  F    1 69.1250 
2014-11-02 10:45:11.332220+00:00 7541  F    1 68.7866 
2014-11-02 10:35:11.332232+00:00 7540  F    1 68.5616 
2014-11-02 10:25:11.202411+00:00 7539  F    1 68.2250 
2014-11-02 10:15:11.932326+00:00 7538  F    1 68.5616 
2014-11-02 10:05:10.922229+00:00 7537  F    1 68.9000 
2014-11-02 09:55:11.602357+00:00 7536  F    1 69.3500 

Edit: Đang cố gắng fig.autofmt_xdate(): Tôi không nghĩ rằng đây sẽ làm các trick. Điều này dường như sử dụng các nhãn x-tick giống nhau cho cả hai biểu đồ ở bên trái và cũng cho cả hai biểu đồ ở bên phải. Dữ liệu của tôi không chính xác. Xin vui lòng xem các đầu ra có vấn đề dưới đây:

enter image description here

Trả lời

14

Ok, cuối cùng đã làm việc. Bí quyết là sử dụng plt.setp để xoay thủ công các nhãn đánh dấu. Sử dụng fig.autofmt_xdate() không hoạt động vì nó có một số điều không mong muốn khi bạn có nhiều điểm con trong hình. Dưới đây là đoạn code làm việc với sản lượng của nó:

for i, d in enumerate([360, 30, 7, 1]): 
    ax = axes.flatten()[i] 
    earlycut = now - relativedelta(days=d) 
    data = df.loc[df.index>=earlycut, :] 
    ax.plot(data.index, data['value']) 

    ax.get_xaxis().set_minor_locator(mpl.ticker.AutoMinorLocator()) 
    ax.get_yaxis().set_minor_locator(mpl.ticker.AutoMinorLocator()) 

    ax.grid(b=True, which='major', color='w', linewidth=1.5) 
    ax.grid(b=True, which='minor', color='w', linewidth=0.75) 

    plt.setp(ax.get_xticklabels(), rotation=30, horizontalalignment='right') 

fig.tight_layout() 

enter image description here

Bằng cách này, những nhận xét trước đây về một số điều matplotlib dùng mãi mãi là rất thú vị ở đây. Tôi đang sử dụng một quả mâm xôi pi để hoạt động như một trạm thời tiết ở một địa điểm xa xôi. Nó thu thập dữ liệu và phục vụ kết quả qua web. Và cậu bé oh boy, nó thực sự thở khò khè cố gắng để đưa ra những đồ họa.

7

Do văn bản cách vẽ được xử lý trong matplotlib, tự động phát hiện văn bản chồng chéo thực sự làm chậm xuống. (Không gian văn bản chiếm không thể được tính toán chính xác cho đến khi nó được rút ra.) Vì lý do đó, matplotlib không cố gắng thực hiện điều này một cách tự động.

Do đó, tốt nhất là nên xoay nhãn đánh dấu dài. Bởi vì các ngày thường gặp vấn đề này, có một phương pháp hình số fig.autofmt_xdate() sẽ (trong số những thứ khác) xoay các nhãn đánh dấu để làm cho chúng dễ đọc hơn một chút. (Lưu ý: Nếu bạn đang sử dụng một phương pháp pandas plot, nó sẽ trả về một đối tượng trục, vì vậy bạn sẽ cần phải sử dụng ax.figure.autofmt_xdate().)

Như một ví dụ nhanh:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

time = pd.date_range('01/01/2014', '4/01/2014', freq='H') 
values = np.random.normal(0, 1, time.size).cumsum() 

fig, ax = plt.subplots() 
ax.plot_date(time, values, marker='', linestyle='-') 

fig.autofmt_xdate() 
plt.show() 

Nếu chúng ta rời fig.autofmt_xdate() ra:

enter image description here

Và nếu chúng ta sử dụng fig.autofmt_xdate():

enter image description here

+0

Giải pháp này có hoạt động đối với một số điểm phụ (giả sử mảng 2x2) với các trục thời gian ngày khác nhau trên tất cả không? – 8one6

+0

(Tôi đã cố gắng thực hiện giải pháp này, nhưng nó chỉ hiển thị nhãn đánh dấu trên hàng dưới cùng của các ô phụ và những nhãn không tương ứng với hàng đầu của các vị trí con.) – 8one6

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