簡體   English   中英

python plotly - 旋轉輔助 X 軸標簽

[英]python plotly - rotating secondary X axis labels

假設我創建了一個 plotly 圖形,如下所示:

x = [['A','A','B','B'], ['X','Y','X','Y']]
y = [1,2,3,2]
fig = go.Figure()
fig.add_bar(x=x, y=y)
fig.show()

我明白了: 在此處輸入圖像描述 我想旋轉輔助 X 標簽(“A”和“B”)。 我試過了:

fig.update_xaxes(tickangle=45)

但這只會旋轉“X”和“Y”標簽。 我該怎么做?

根據 plotly 團隊的討論,似乎沒有實現為多類別軸旋轉兩個標簽的功能,因為如果輔助 label 很長,則很難控制重疊標簽。

在您的情況下,您可能做的最好的事情是將輔助標簽添加為注釋。 我用不同數量的空格替換了每個唯一的 label,因此它們不會顯示,但仍被 Plotly 解釋為另一個類別(例如'A'替換為' ''B'替換為' ' ,等等上...)。

然后,與其僅僅將標簽放置在我們知道它們應該放置的位置 go 中,不如制作一個可擴展的 function,它根據您擁有的輔助 x 標簽的數量確定輔助標簽的放置位置。 我寫了一個 function 在下面(為了演示,我修改了輔助標簽的數量):

import plotly.graph_objects as go

## use placeholders so labels don't show up
## map each unique label to a different number of spaces
## extend the labels to show that the solution can be generalized
secondary_labels = ['A','A','A','B','B','C']

label_set = sorted(set(secondary_labels), key=secondary_labels.index)
label_mapping = {label:' '*i for i, label in enumerate(label_set)}
secondary_labels_mapped = [label_mapping[label] for label in secondary_labels]

x = [secondary_labels_mapped, ['X','Y','Z','X','Y','X']]
y = [1,2,3,4,2,4]

## source: https://www.geeksforgeeks.org/python-program-to-find-cumulative-sum-of-a-list/
def cumsum(lists):
    cu_list = []
    length = len(lists)
    cu_list = [sum(lists[0:x:1]) for x in range(0, length+1)]
    return cu_list[1:]

relative_lengths = {}
start_loc = []
for label in label_set:
    relative_lengths[label] = secondary_labels.count(label) / len(secondary_labels)

## get the length of each interval
end_lens = list(relative_lengths.values())
start_lens = [0] + end_lens[:-1]

end_locs = cumsum(end_lens)
start_locs = cumsum(start_lens)

annotation_locs = [(start + end) / 2 for start, end in zip(start_locs, end_locs)]

fig = go.Figure()
fig.add_bar(x=x, y=y)

for label, loc in zip(label_set,annotation_locs):
    fig.add_annotation(
        x=loc,
        y=0,
        xref="paper",
        yref="paper",
        text=label,
        showarrow=False,
    )

## shift annotations down so they display on the axes
fig.update_annotations(yshift=-40)
fig.show()

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM