[英]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>')
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
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.