09 August 2020

Plotly-области: немного о подписях графиков

Ранее в посте Plotly : области. Делаем два графика мы сделали два графика.

Подписи для каждого из них мы задавали прямо при разбиении областей:

fig = make_subplots(rows=2, cols=1 , subplot_titles = ('Upper', 'Lower') )

И если нам требуется изменить, скажем, подписи осей или всей диаграммы, то никаких проблем не возникнет - это вызывается так:

fig.update_yaxes( title = 'My second Y axis' , row =2 , col =1 )
fig.update_layout( title = 'My New Chart' )


Однако с подписями областей такой трюк не пройдет.  Для начала, давайте поймем где же они хранятся. Это можно сделать печатью содержимого разметки фигуры, т.е. свойства layout:

Как можно видеть, они находятся под ключом annotations в виде списка словарей, где ключом является  text. Поэтому логично, что если мы хотим изменить подпись верхнего графика, то надо брать нулевой элемент:

 

Однако Plotly предоставляет и иной способ ее поменять - по свойству элемента.

Если посмотреть описание по документации plotly.graph_objects.Figure :
 

 

то, при том что там как бы есть парамеры row/col, все равно ничего на выйдет - все указанные методы и попытки поменять подпись таким образом, не работают:

# попытка 1 - не работает
fig.update_annotations( patch= dict(text = 'Second upper test ') , row =1 , col =1)

# попытка 2 - не работает
fig.update_annotations( text = 'Second upper test ' , row =1 , col =1)

# попытка 3 - не работает
fig.update_annotations( dict(text = 'Second upper test ') , row =1 , col =1)


Однако удивительно, что работает ссылка на элемент через селектор - т.е. ему надо указать словарь со свойствами желательного элемента. Как можно видеть наиболее яркое, кроме ключей x и y, у нас только свойство text. Так и попробуем:

fig.update_annotations( text = 'Second upper test' , selector = dict(text= 'Test Upper') )

И вуаля! - это работает:

 

Таким образом чтобы изменить подписи областей у нас два варианта: либо явно ссылаемся на элемент списка, либо используем селектор, задавая предыдущий текст.


No comments:

Post a Comment