[英]python plotly - rotating secondary X axis labels
根據 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.