Как добавить собственные метки в дендрограмму в plotly-dash? - PullRequest
0 голосов
/ 07 ноября 2019

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

@app.callback(
    Output('peakAreas', 'figure'),
    [Input('b_peakAreas', 'n_clicks'),
     Input('table', 'derived_virtual_indices'),
     Input('checklist', 'value')]) def plot_0(n_clicks, ndxs, options):
    title = 'Heatmap'
    if n_clicks is None:
        return {}
    df = mint.crosstab.T.iloc[ndxs]
    df.index = [basename(i).replace('.mzXML', '') for i in df.index]

    if 'normed' in options:
        df = df / df.max()
        title = f'Normalized {title}'



    if 'clustered' in options:
        D = squareform(pdist(df, metric='euclidean'))
        Y = linkage(D, method='complete')
        Z = dendrogram(Y, orientation='left', no_plot=True)['leaves']
        df = df.iloc[Z,:]
        dendro_side = ff.create_dendrogram(df, orientation='right')

    heatmap = go.Heatmap(z=df.values,
                         x=df.columns,
                         y=df.index,
                         colorscale = 'Blues')

    if not 'dendrogram' in options:
        fig = go.Figure(heatmap)
        fig.update_layout(
            title={'text': title,  },
            yaxis={'title': '', 
                'tickmode': 'array', 
                'automargin': True}) 
        return fig

    fig = go.Figure()

    for i in range(len(dendro_side['data'])):
            dendro_side['data'][i]['xaxis'] = 'x2'

    for data in dendro_side['data']:
        fig.add_trace(data)

    y_labels = heatmap['y']


    heatmap['y'] = dendro_side['layout']['yaxis']['tickvals']
    dendro_side['layout']['yaxis']['ticktext'] = y_labels

    fig.add_trace(heatmap)     

    fig.update_layout({'showlegend':False, 'hovermode': 'closest'})
    fig.update_layout(
            title={'text': title,  },
            yaxis={'title': '', 
                'tickmode': 'array', 
                'automargin': True}) 


    fig.update_layout(xaxis2={'domain': [0, .1],
                              'mirror': False,
                              'showgrid': True,
                              'showline': False,
                              'zeroline': False,
                              'showticklabels': False,
                              'ticks':""})        

    fig.update_layout(xaxis={'domain': [.1, 1],
                             'mirror': False,
                             'showgrid': False,
                             'showline': False,
                             'zeroline': False,
                             'showticklabels': True,
                             'ticks':""})
    # Edit yaxis
    fig.update_layout(yaxis={'domain': [0, 1],
                             'mirror': False,
                             'showgrid': False,
                             'showline': False,
                             'zeroline': False,
                             'showticklabels': True,
                            })

    fig.update_layout(yaxis_ticktext = y_labels)

    print(dendro_side.layout['yaxis'])
    return fig

Когда я строю макет оси Y, я получаю следующее:

layout.YAxis({
    'mirror': 'allticks',
    'rangemode': 'tozero',
    'showgrid': False,
    'showline': True,
    'showticklabels': True,
    'tickmode': 'array',
    'ticks': 'outside',
    'ticktext': array(['SA1', 'SA3', 'SA2', 'SA4', 'CA1', 'CA2', 'CA3', 'CA4', 'EC2', 'EC4',
                       'EC1', 'EC3'], dtype=object),
    'tickvals': [5.0, 15.0, 25.0, 35.0, 45.0, 55.0, 65.0, 75.0, 85.0, 95.0, 105.0,
                 115.0],
    'type': 'linear',
    'zeroline': False
})

Так что, мне кажется, на графике должны быть правильные метки, так как правильные данные хранятся в текстовом формате. Но это не проявляется.

enter image description here

...