Câu hỏi Thay đổi vòng quay của nhãn đánh dấu trong bản đồ nhiệt Seaborn


Tôi đang vẽ sơ đồ nhiệt ở Seaborn. Vấn đề là tôi có quá nhiều ô vuông trong cốt truyện của tôi nên các nhãn x và y quá gần nhau để có ích. Vì vậy, tôi đang tạo một danh sách các xticks và yticks để sử dụng. Tuy nhiên, chuyển danh sách này đến hàm quay các nhãn trong ô. Sẽ rất tuyệt khi con trai biển tự động thả một số bọ ve, nhưng tôi muốn có thể có yticks thẳng đứng.

import pandas as pd
import numpy as np
import seaborn as sns

data = pd.DataFrame(np.random.normal(size=40*40).reshape(40,40))

yticks = data.index
keptticks = yticks[::int(len(yticks)/10)]
yticks = ['' for y in yticks]
yticks[::int(len(yticks)/10)] = keptticks

xticks = data.columns
keptticks = xticks[::int(len(xticks)/10)]
xticks = ['' for y in xticks]
xticks[::int(len(xticks)/10)] = keptticks

sns.heatmap(data,linewidth=0,yticklabels=yticks,xticklabels=xticks)

enter image description here


35
2017-11-20 10:28


gốc




Các câu trả lời:


seaborn sử dụng matplotlib bên trong, như vậy bạn có thể sử dụng matplotlib các chức năng để sửa đổi các ô của bạn. Tôi đã sửa đổi mã bên dưới để sử dụng plt.yticks chức năng để thiết lập rotation=0 khắc phục sự cố.

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


data = pd.DataFrame(np.random.normal(size=40*40).reshape(40,40))

yticks = data.index
keptticks = yticks[::int(len(yticks)/10)]
yticks = ['' for y in yticks]
yticks[::int(len(yticks)/10)] = keptticks

xticks = data.columns
keptticks = xticks[::int(len(xticks)/10)]
xticks = ['' for y in xticks]
xticks[::int(len(xticks)/10)] = keptticks

sns.heatmap(data,linewidth=0,yticklabels=yticks,xticklabels=xticks)

# This sets the yticks "upright" with 0, as opposed to sideways with 90.
plt.yticks(rotation=0) 

plt.show()

Plot


50
2017-11-20 10:36



Vì vậy, thực sự là phần cần thiết duy nhất là plt.yticks(rotation=0) - Tom
@Từ vâng. Phần còn lại của mã là có để OP (hoặc bất cứ ai khác) có thể tái tạo một cốt truyện hoàn toàn làm việc. Tôi đã nhận xét một phần cụ thể mà nó khác và tại sao nó khác. - Ffisegydd
Đối với những người vào danh sách hiểu yticks = data.index  yticks = [str(x) if i % 10 == 0 else '' for i,x in enumerate(yticks)] - Overdrivr


Bạn cũng có thể gọi các phương thức của đối tượng heatmap:

    g = sns.heatmap(data,linewidth=0,yticklabels=yticks,xticklabels=xticks)
    g.set_yticklabels(g.get_yticklabels(), rotation = 0, fontsize = 8)

Tôi không chắc chắn tại sao điều này không có trong tài liệu hướng dẫn cho sns.heatmap, nhưng các phương thức tương tự được mô tả ở đây: http://seaborn.pydata.org/generated/seaborn.FacetGrid.html

Tôi tin rằng những phương pháp này có sẵn cho tất cả các đối tượng âm mưu seaborn nhưng không thể tìm thấy một API chung cho điều đó.


14
2018-06-06 14:04



Tôi đoán nó trở nên rõ ràng hơn nếu bạn gọi các đối tượng một cách nhất quán với ký hiệu matplotlib, tức là ax=sns.heatmap(..); ax.set_yticklabels(). Sau đó, nó có thể được rõ ràng hơn rằng các giải pháp là để được tìm thấy trong tài liệu matplotlib. - ImportanceOfBeingErnest