перевернутый текст метки (пол-оборота) для хордовой диаграммы на головизорах с боке

В примере в https://holoviews.org/reference/elements/bokeh/Chord.html, как изменить ориентацию текста метки на 180 °, чтобы избежать поворотов, при которых текст метки переворачивается вверх ногами в левом полукруге (см. рисунки). Backend - это боке. После этого изменения текст метки станет более читабельным.

Вот что я сделал до сих пор:

import numpy as np

def rotate_label(plot, element):
        angles = plot.handles['text_1_source'].data['angle']
        angles[np.where((angles < -1.5707963267949) | (angles > 1.5707963267949))] += 3.1415926535898

chord.opts(cmap='Category20b',
           edge_cmap='Category20b', 
           edge_color=dim('source').str(), 
           labels='index', 
           node_color=dim('index').str(),
           hooks=[rotate_label]
           )

Первое изображение (текущее):

введите описание изображения здесь

Вторая картинка (объективная):

введите описание изображения здесь


person mouwsy    schedule 04.01.2021    source источник


Ответы (1)


Это было довольно сложно. Если текст метки состоит всего из нескольких символов, это решение с крючком может быть подходящим. Я уверен, что код можно было бы написать более четко, но у меня нет опыта работы с numpy.

import numpy as np

def rotate_label(plot, element):
    white_space = "      "
    angles = plot.handles['text_1_source'].data['angle']
    characters = np.array(plot.handles['text_1_source'].data['text'])
    plot.handles['text_1_source'].data['text'] = np.array([x + white_space if x in characters[np.where((angles < -1.5707963267949) | (angles > 1.5707963267949))] else x for x in plot.handles['text_1_source'].data['text']])
    plot.handles['text_1_source'].data['text'] = np.array([white_space + x if x in characters[np.where((angles > -1.5707963267949) | (angles < 1.5707963267949))] else x for x in plot.handles['text_1_source'].data['text']])
    angles[np.where((angles < -1.5707963267949) | (angles > 1.5707963267949))] += 3.1415926535898
    plot.handles['text_1_glyph'].text_align = "center"

chord.opts(cmap='Category20b',
           edge_cmap='Category20b', 
           edge_color=dim('source').str(), 
           labels='index', 
           node_color=dim('index').str(),
           hooks=[rotate_label]
           )

Переменная white_space содержит несколько символов пробела, которые при необходимости можно изменить, чтобы разместить текст метки.
Это не идеально с центрированным текстом метки (plot.handles['text_1_glyph'].text_align = "center"). Лучшим решением было бы выровнять текст метки левого полукруга по right, а текст метки правого полукруга по left. Но я не знаю, как это сделать.

person mouwsy    schedule 07.01.2021