简体   繁体   English

Plotly:如何在带注释的热图中舍入显示文本,但在 hover 上保持完整格式?

[英]Plotly: How to round display text in annotated heatmap but keep full format on hover?

I am drawing a correlation matrix of the Titanic dataset.我正在绘制泰坦尼克号数据集的相关矩阵。

df_corr = df.corr()

Originally, the matrix looks like this:最初,矩阵如下所示:

fig = ff.create_annotated_heatmap(
            z=df_corr.to_numpy(),
            x=df_corr.columns.tolist(),
            y=df_corr.index.tolist(),
            zmax=1, zmin=-1,
            showscale=True,
            hoverongaps=True
            )
# add title
fig.update_layout(title_text='<i><b>Correlation not round</b></i>')

not_round

I want to round the float number, so they display less digits after the .我想对浮点数进行四舍五入,因此它们在. dot.点。

The current workaround is actually round the pandas dataframe before input.当前的解决方法实际上是在输入之前将 pandas dataframe 舍入。

df_corr_round = df_corr.round(3)
fig = ff.create_annotated_heatmap(
            z=df_corr_round.to_numpy(),
            x=df_corr.columns.tolist(),
            y=df_corr.index.tolist(),
            zmax=1, zmin=-1,
            showscale=True,
            hoverongaps=True
            )
# add title
fig.update_layout(title_text='<i><b>Correlation round</b></i>')

圆形的

But the workaround also rounds the text when I hover mouse over.但是当我将鼠标悬停在 hover 上时,解决方法也会对文本进行四舍五入。 I want hover text in full detail while display text are round.我想要 hover 文本的完整细节,而显示文本是圆形的。

Can I display less digits on each cell without changing the input dataframe?我可以在不更改输入 dataframe 的情况下在每个单元格上显示更少的数字吗?

I can only assume that you're building your ff.create_annotated_heatmap() from a list of lists as they do in the docs under Annotated Heatmaps in Python .我只能假设您正在从列表列表中构建您的ff.create_annotated_heatmap() ,就像它们在 Python中的注释热图下的文档中所做的那样。 And don't worry if you're using a pandas dataframe instead.如果您使用的是 pandas dataframe,请不要担心。 The complete snippet below will show you how you construct a correlation matrix from a pandas dataframe with multiple timeseries of stocks px.data.stocks , and then make a list of lists using df.values.tolist() to build an annotated heatmap.下面的完整片段将向您展示如何从 pandas dataframe 与多个股票px.data.stocks的时间序列构建相关矩阵,然后使用df.values.tolist()制作一个列表列表以构建带注释的热图。 If you're doing something similar, then one way of building the annotations would be to define a text like this:如果您正在做类似的事情,那么构建注释的一种方法是定义这样的文本:

z_text = [[str(y) for y in x] for x in z]

And then all you'll need to get the number of digits you want is use round() :然后你需要得到你想要的位数就是使用round()

z_text = [[str(round(y, 1)) for y in x] for x in z]

As you can see below, this approach (1) does not alter the source dataframe like df_corr.round() would have, (2) shows only 1 digit in the figure, and (3) shows a longer number format on hover.正如您在下面看到的,这种方法 (1)不会df_corr.round()那样更改源 dataframe,(2) 在图中仅显示 1 个数字,并且 (3) 在 hover 上显示更长的数字格式。 In the image I'm hovering on MSFT / FB = 0.5在图像中,我悬停在MSFT / FB = 0.5

在此处输入图像描述

Complete code:完整代码:

import plotly.express as px
import plotly.figure_factory as ff
import pandas as pd

df = px.data.stocks()#.tail(50)
df = df.drop(['date'], axis = 1)
dfc = df.corr()
z = dfc.values.tolist()

# change each element of z to type string for annotations
# z_text = [[str(y) for y in x] for x in z]
z_text = [[str(round(y, 1)) for y in x] for x in z]

# set up figure 
fig = ff.create_annotated_heatmap(z, x=list(df.columns),
                                     y=list(df.columns),
                                     annotation_text=z_text, colorscale='agsunset')

# add title
fig.update_layout(title_text='<i><b>Confusion matrix</b></i>',
                  #xaxis = dict(title='x'),
                  #yaxis = dict(title='x')
                 )

# add custom xaxis title
fig.add_annotation(dict(font=dict(color="black",size=14),
                        x=0.5,
                        y=-0.15,
                        showarrow=False,
                        text="",
                        xref="paper",
                        yref="paper"))

# add custom yaxis title
fig.add_annotation(dict(font=dict(color="black",size=14),
                        x=-0.35,
                        y=0.5,
                        showarrow=False,
                        text="",
                        textangle=-90,
                        xref="paper",
                        yref="paper"))

# adjust margins to make room for yaxis title
fig.update_layout(margin=dict(t=50, l=200))

# add colorbar
fig['data'][0]['showscale'] = True
fig.show()

I don't have the data at hand, so I haven't been able to check the execution, but I think the following code will work.我手头没有数据,所以无法检查执行情况,但我认为下面的代码会起作用。 Please refer to the official reference .请参考官方参考

df_corr_round = df_corr.round(3)
fig = ff.create_annotated_heatmap(
            z=df_corr,
            x=df_corr.columns.tolist(),
            y=df_corr.index.tolist(),
            zmax=1, zmin=-1,
            showscale=True,
            hoverongaps=True,
            annotation_text=df_corr_round.to_numpy(),
            )
# add title
fig.update_layout(title_text='<i><b>Correlation round</b></i>')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM