Xoay văn bản nhãn trong yếu tố seaborn


152

Tôi có một yếu tố đơn giản

import seaborn as sns
g = sns.factorplot("name", "miss_ratio", "policy", dodge=.2, 
    linestyles=["none", "none", "none", "none"], data=df[df["level"] == 2])

nhập mô tả hình ảnh ở đây

Vấn đề là tất cả các nhãn x chạy cùng nhau, làm cho chúng không thể đọc được. Làm thế nào để bạn xoay văn bản để các nhãn có thể đọc được?


29
import matplotlib.pylab as plt. plt.xticks(rotation=‌​45)
rafaelvalle

Các thư viện Dexplot có khả năng bọc nhãn, thiết teh kích thước hình, Sở KH & ĐT tất cả mà không sử dụng matplotlib.
Ted Petrou

Câu trả lời:


137

Aman đúng là bạn có thể sử dụng các lệnh matplotlib bình thường, nhưng điều này cũng được tích hợp vào FacetGrid:

import seaborn as sns
planets = sns.load_dataset("planets")
g = sns.factorplot("year", data=planets, aspect=1.5, kind="count", color="b")
g.set_xticklabels(rotation=30)

nhập mô tả hình ảnh ở đây

Có một số ý kiến ​​và một câu trả lời khác cho rằng "không hoạt động", tuy nhiên, bất kỳ ai cũng có thể chạy mã như được viết ở đây và thấy rằng nó hoạt động. Câu trả lời khác không cung cấp một ví dụ có thể lặp lại về những gì không hoạt động, khiến việc giải quyết rất khó khăn, nhưng tôi đoán là mọi người đang cố gắng áp dụng giải pháp này cho đầu ra của các hàm trả về một Axesđối tượng thay vì a Facet Grid. Đây là những điều khác nhau và Axes.set_xticklabels()phương pháp thực sự yêu cầu một danh sách các nhãn và không thể đơn giản thay đổi các thuộc tính của các nhãn hiện có trên Axes. Bài học là điều quan trọng là phải chú ý đến loại đối tượng bạn đang làm việc.


Tôi gặp lỗi: IndexError: quá nhiều chỉ số. Mã của tôi! g = sns.factorplot ("tháng_date", "num_proposeals", "tài khoản", sort_data, col = "tài khoản", col_wrap = 3, sharex = false); g.set_xticklabels (rotation = 30)
yoshiserry

10
@soupault - cái này hiệu quả với tôi, tương tự như những gì bạn nghĩ ra nhưng có lẽ sạch hơn một chút - cho ax trong g.axes.flatten (): ax.set_xticklabels (ax.get_xticklabels (), rotation = 30)
odedbd

6
Sử dụng ha="right"để căn giữa các nhãn trục x với dấu tick của chúng. tức làg.set_xticklabels([label1, label2], rotation=30, ha='right')
Manavalan Gajapathy

72
tương tự như một vài nhận xét ở trên, điều này đã gây ra lỗi cho tôi cho đến khi tôi đổi g.set_xticklabels(rotation=30)thành g.set_xticklabels(g.get_xticklabels(), rotation=30)câu trả lời này: stackoverflow.com/a/39489464/1870832
Max Power

1
Một số phương thức vẽ đồ thị của Seaborn trả về một FacetGridđối tượng, một số trả về một Axesđối tượng Matplotlib . Đối với cái trước, không đặt nhãn sẽ hoạt động, đối với cái sau, nó sẽ không. Bạn có thể xem FacetGridđối tượng nào bằng cách xem tài liệu: seaborn.pydata.org/api.html . Ví dụ, nếu bạn sử dụng g = sns.catplot()thì nó sẽ hoạt động, nhưng sns.barplot()sẽ không vì nó trả về một Axesđối tượng.
getup8

252

Tôi đã gặp vấn đề với câu trả lời của @mwaskorn, cụ thể là

g.set_xticklabels(rotation=30)

thất bại, bởi vì điều này cũng đòi hỏi các nhãn. Một chút dễ dàng hơn câu trả lời của @Aman là chỉ cần thêm

plt.xticks(rotation=45)

33
Bạn cũng có thể nhận được các nhãn như vậy g.set_xticklabels(g.get_xticklabels(), rotation=30). Gán nó cho một biến nếu bạn muốn triệt tiêu đầu ra.
joelostblom 7/2/2016

3
Tôi nghĩ rằng điều này là chính xác, khi thiết lập plt.xticslàm việc cho tôi.
muammar

đã thử tất cả các tùy chọn ở trên cho một âm mưu violin và plt.xticks (rotation = n) chỉ là một thứ tôi có thể làm việc
A Rob4 28/12/19

29

Đây vẫn là một đối tượng matplotlib. Thử cái này:

# <your code here>
locs, labels = plt.xticks()
plt.setp(labels, rotation=45)

8

Nếu bất cứ ai tự hỏi làm thế nào để làm điều này cho clustermap CorrGrids (một phần của một ví dụ đi biển đã cho):

import seaborn as sns
import matplotlib.pyplot as plt
sns.set(context="paper", font="monospace")

# Load the datset of correlations between cortical brain networks
df = sns.load_dataset("brain_networks", header=[0, 1, 2], index_col=0)
corrmat = df.corr()

# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(12, 9))

# Draw the heatmap using seaborn
g=sns.clustermap(corrmat, vmax=.8, square=True)
rotation = 90 
for i, ax in enumerate(g.fig.axes):   ## getting all axes of the fig object
     ax.set_xticklabels(ax.get_xticklabels(), rotation = rotation)


g.fig.show()

6

Bạn cũng có thể sử dụng plt.setpnhư sau:

import matplotlib.pyplot as plt
import seaborn as sns

plot=sns.barplot(data=df,  x=" ", y=" ")
plt.setp(plot.get_xticklabels(), rotation=90)

để xoay nhãn 90 độ.


5

Đối với a seaborn.heatmap, bạn có thể xoay chúng bằng cách sử dụng (dựa trên câu trả lời của @ Aman )

pandas_frame = pd.DataFrame(data, index=names, columns=names)
heatmap = seaborn.heatmap(pandas_frame)
loc, labels = plt.xticks()
heatmap.set_xticklabels(labels, rotation=45)
heatmap.set_yticklabels(labels[::-1], rotation=45) # reversed order for y

1
điều này làm việc cho tôi, chỉ cần thông qua vòng quay param không làm gì cả, tôi cũng phải chuyển qua nhãn để làm việc này
Raveen Beemsingh

0

Bất kỳ lô đất nào được hỗ trợ bởi facetgrid sẽ không hoạt động với (ví dụ catplot)

g.set_xticklabels(rotation=30) 

tuy nhiên barplot, Countplot, v.v. sẽ hoạt động vì chúng không được facetgrid hỗ trợ. Dưới đây sẽ làm việc cho họ.

g.set_xticklabels(g.get_xticklabels(), rotation=30)

Ngoài ra, trong trường hợp bạn có 2 biểu đồ chồng lên nhau, hãy thử set_xticklabels trên biểu đồ hỗ trợ nó.

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.