[英]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.