带有散景的全息视图上的弦图的倒置标签文本(半圈)
inverted label text (half turn) for Chord diagram on holoviews with bokeh
在 https://holoviews.org/reference/elements/bokeh/Chord.html 中的示例中,如何将标签文本的方向更改为 180°,以避免在左半圆中翻转标签文本的旋转(参见图片)。后端是散景。通过此更改,标签文本将更具可读性。
这是我到目前为止所做的:
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]
)
第一张图片(当前):
第二张图片(objective):
这很难。如果标签文本只有几个字符长,那么这个带有钩子的解决方案可能是合适的。我相信代码可以写得更清楚,但我没有使用 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
。但我不知道该怎么做。
在 https://holoviews.org/reference/elements/bokeh/Chord.html 中的示例中,如何将标签文本的方向更改为 180°,以避免在左半圆中翻转标签文本的旋转(参见图片)。后端是散景。通过此更改,标签文本将更具可读性。
这是我到目前为止所做的:
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]
)
第一张图片(当前):
第二张图片(objective):
这很难。如果标签文本只有几个字符长,那么这个带有钩子的解决方案可能是合适的。我相信代码可以写得更清楚,但我没有使用 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
。但我不知道该怎么做。