Цвет фона для текстовых меток в Plotly?

Я показываю часть уменьшенного изображения Word Embedding с помощью Plotly в Python. Я использую 3D-точечный график, и пока все работает нормально, с этим кодом (разбитым):

fig = go.Figure()
trace = go.Scatter3d(
        x=df[0],
        y=df[1],
        z=df[2],
        text=df.index,
        mode="markers+text",
        textfont=dict(
            color=["crimson"]),
        marker=dict(
            size=3),
        hoverinfo="skip")

fig.add_trace(trace)

fig.show()

Единственная проблема, с которой я сталкиваюсь, заключается в том, что некоторые метки точек данных перекрываются, что на первый взгляд делает их нечитаемыми.

Есть ли возможность указать цвет фона текстовых меток?

Изменить:

Первые 5 строк моего df выглядят так, и все данные структурированы таким образом. Индекс — это слово, а три столбца — его положение в трехмерном пространстве.

                        0         1         2
chancellor       1.102989  0.416767  2.071260
abdicate         0.028073  1.156498  1.911484
overthrow        2.435294 -0.305266  0.998094
candidate        0.259697  0.648845  0.448700
elections        0.122355  0.815206  1.107913

Однако моя проблема на самом деле не в данных, а в возможностях настройки визуализации.

Изменить2:

Вот так выглядит мой сюжет.

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

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


person backendboi    schedule 07.07.2020    source источник
comment
stackoverflow .com/questions/38462844/   -  person bigbounty    schedule 07.07.2020
comment
@bigbounty Спасибо, но это говорит только о цвете фона всего сюжета. Я ищу цвет фона только для меток точек данных.   -  person backendboi    schedule 07.07.2020
comment
@backendboi, вы не против создать mcve? В частности, образец df будет отличным.   -  person rpanai    schedule 07.07.2020
comment
@rpanai Спасибо, что указали на это, я только что добавил дополнительную информацию. Я не совсем уверен, как инициализировать фрейм данных (кратко) в коде, так как это продукт более сложных операций.   -  person backendboi    schedule 07.07.2020
comment
Это звучит как ошибка для меня. Вы пытались добавить текст явно как здесь   -  person rpanai    schedule 07.07.2020
comment
@rpanai Я добавил изображение, чтобы проиллюстрировать свою проблему, и на самом деле не думаю, что это ошибка, но, возможно, это просто вариант использования, для которого библиотека не предназначена ...   -  person backendboi    schedule 08.07.2020
comment
@backendboi, когда я пытаюсь запустить ваш код, я вижу, что какой-то текст находится за фоном трехмерных осей. Я чувствую, что это ошибка. Этого не происходит с аннотациями, поскольку вы добавляете слой поверх графика.   -  person rpanai    schedule 08.07.2020


Ответы (1)


Я нашел обходной путь, не используя параметр text в определении трассировки, а добавляя аннотации для каждой точки данных. Теперь код выглядит так:

trace = go.Scatter3d(
            x=df[0],
            y=df[1],
            z=df[2],
            mode="markers",
            marker=dict(size=3),
            hoverinfo="skip")
    
annos = []
first = True
for index, row in df.iterrows():
    if first:
        col = "black"
        first = False
    else:
        col = "black"
            
    anno = dict(x=row[0],
                y=row[1],
                z=row[2],
                text=index,
                showarrow=True,
                arrowhead=0,
                font=dict(color=col),
                ax=0,
                ay=-20,
                bgcolor="white",
                opacity=0.85)

    annos.append(anno)
        
fig = go.Figure()
fig.add_trace(trace)
fig.update_layout(scene=dict(annotations=annos)

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

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

person backendboi    schedule 08.07.2020