我有一个密度热图,使用的是Ploly库,特别是Ploly Express for Python.在它中,x轴对应于数据框中的‘父亲的教育程度’列,y轴对应于‘母亲的教育程度’列,z轴对应于‘百分比’列.我想要的是在悬停信息中额外包括‘频率’列,这样当悬停在单元格上时,该数据也会显示出来.我试过使用‘Text’参数,但它不适用于密度热图.因此,我目前正在试验‘meta’参数,但它显示的是‘%{data[n[.meta[i]}’,而不是频率.

fig_heatmap = px.density_heatmap(total,
                                 x='Estudios de la madre',
                                 y='Estudios del padre',
                                 z='Porcentaje',
                                 category_orders={'Estudios de la madre': orden_estudios,
                                                      'Estudios del padre': orden_estudios},
                                 text_auto=True,
                                 color_continuous_scale='blues',
                                 range_color=[0, 15])
fig_heatmap.update_coloraxes(colorbar_title='Porcentaje')
fig_heatmap.update_traces(meta=total.Frecuencia,
                          hovertemplate='Estudios de la madre: %{x}<br>' +
                                       'Estudios del padre: %{y}<br>' +
                                       'Porcentaje: %{z}<br>' +
                                       'Frecuencia: %{data[n[.meta[i]}')
                             

st.plotly_chart(fig_heatmap, use_container_width=True)

以下是一些样本数据:

data = [
    ("Primaria o secundaria", "Primaria o secundaria", 320, 41.03),
    ("Primaria o secundaria", "Bachillerato", 120, 15.42),
    ("Bachillerato", "Bachillerato", 150, 19.27),
    ("Bachillerato", "Primaria o secundaria", 80, 10.27),
    ("Primaria o secundaria", "Carrera técnica", 50, 6.42),
    ("Primaria o secundaria", "No sé", 40, 5.14),
    ("Carrera técnica", "Carrera técnica", 30, 3.85),
    ("Carrera técnica", "Primaria o secundaria", 20, 2.57),
    ("No sé", "No sé", 20, 2.57),
    ("Bachillerato", "Carrera técnica", 10, 1.28),
    ("Licenciatura", "Primaria o secundaria", 10, 1.28),
    ("Carrera técnica", "Bachillerato", 5, 0.64),
    ("Primaria o secundaria", "Licenciatura", 5, 0.64),
    ("Bachillerato", "Licenciatura", 5, 0.64),
    ("Bachillerato", "No sé", 5, 0.64),
    ("Licenciatura", "Bachillerato", 5, 0.64),
    ("Licenciatura", "Licenciatura", 5, 0.64),
    ("No sé", "Primaria o secundaria", 5, 0.64),
    ("Licenciatura", "No sé", 5, 0.64),
    ("Carrera técnica", "Licenciatura", 5, 0.64),
    ("Licenciatura", "Carrera técnica", 5, 0.64),
    ("Carrera técnica", "No sé", 5, 0.64),
    ("No sé", "Bachillerato", 5, 0.64),
    ("No sé", "Carrera técnica", 5, 0.64),
    ("Posgrado", "Primaria o secundaria", 5, 0.64),
    ("Carrera técnica", "Posgrado", 5, 0.64),
    ("Posgrado", "Carrera técnica", 5, 0.64),
    ("Posgrado", "Bachillerato", 5, 0.64),
    ("Posgrado", "Posgrado", 5, 0.64),
    ("No sé", "Licenciatura", 5, 0.64),
    ("Bachillerato", "Posgrado", 5, 0.64),
    ("Posgrado", "Licenciatura", 5, 0.64),
    ("Licenciatura", "Posgrado", 5, 0.64),
    ("Posgrado", "No sé", 5, 0.64),
    ("Primaria o secundaria", "Posgrado", 5, 0.64)
]

推荐答案

如果要将自定义数据添加到悬停模板,则必须与图表的数据 struct 相同.在本例中,它是一个热图,因此需要多个行和列的array.我正在将数据从提交的数据转换为水平格式,以匹配图表的数据 struct ,并对每个类别列进行排序.整个数据帧以数组形式提供给客户数据.

import pandas as pd
total = pd.DataFrame(data)
total.columns = ['Estudios de la madre','Estudios del padre','Frecuencia','Porcentaje']

df = total.pivot(index='Estudios del padre', columns='Estudios de la madre', values='Frecuencia')
col_order = ['Primaria o secundaria','Bachillerato','Carrera técnica','No sé','Licenciatura','Posgrado']
df = df.reindex(columns=col_order)
df = df.reindex(index=col_order) 

import plotly.express as px

fig_heatmap = px.density_heatmap(total,
                                 x='Estudios de la madre',
                                 y='Estudios del padre',
                                 z='Porcentaje',
                                 # category_orders={'Estudios de la madre': orden_estudios,
                                 #                      'Estudios del padre': orden_estudios},
                                 text_auto=True,
                                 color_continuous_scale='blues',
                                 range_color=[0, 15])
fig_heatmap.update_coloraxes(colorbar_title='Porcentaje')
fig_heatmap.update_traces(meta=df.values,
                          hovertemplate='Estudios de la madre: %{x}<br>' +
                                       'Estudios del padre: %{y}<br>' +
                                       'Porcentaje: %{z}<br>' +
                                       'Frecuencia: %{meta}')
                             
fig_heatmap.show()
#st.plotly_chart(fig_heatmap, use_container_width=True)

enter image description here

Python相关问答推荐

将两个收件箱相连导致索引的列标题消失

这些变量是否相等,因为它们引用相同的实例,尽管它们看起来应该具有不同的值?

Python在通过Inbox调用时给出不同的响应

在Transformer中使用LabelEncoding的ML模型管道

如何知道标志是否由用户传递或具有默认值?

在for循环中仅执行一次此操作

分组数据并删除重复数据

如何使用Google Gemini API为单个提示生成多个响应?

具有多个选项的计数_匹配

我在使用fill_between()将最大和最小带应用到我的图表中时遇到问题

C#使用程序从Python中执行Exec文件

在Python中管理打开对话框

Polars:用氨纶的其他部分替换氨纶的部分

"使用odbc_connect(raw)连接字符串登录失败;可用于pyodbc"

如何在给定的条件下使numpy数组的计算速度最快?

如何将一个动态分配的C数组转换为Numpy数组,并在C扩展模块中返回给Python

Pandas—在数据透视表中占总数的百分比

Tkinter菜单自发添加额外项目

为什么np. exp(1000)给出溢出警告,而np. exp(—100000)没有给出下溢警告?

在Docker容器(Alpine)上运行的Python应用程序中读取. accdb数据库