Plotly.express中树图的聚合计算方法 - Python

3

提前感谢那些愿意帮助我的人。这是我第一次提出问题,我已经在这个问题上苦苦挣扎了好几天!对于帮助我的人,永远的荣耀!

让我用几行代码和屏幕来解释我的问题。

我想创建一个树状图,显示两个日期之间值的增长情况。为了更精确,我希望这个树状图: - 拥有一个大小与日期2上的值x成比例的正方形,并且根据从日期1到日期2的值x的增长情况着色。

让我们考虑以下示例:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly.express as px
import plotly



data = {'variable': ['a', 'b', 'c'],
        'parent': ['I', 'I', 'II'],
     'value_1': [1,4,5],
     'value_2': [4,2,5]
     }

df = pd.DataFrame(data)
df['growth'] = 100 * (df['value_2'] / df['value_1'] - 1)

fig = px.treemap(df,  path=['parent', 'variable'], values = 'value_2', color='growth', 
                 color_continuous_scale='plasma')

fig.show()
   

它在这里为我提供了美丽的树状图:增长树状图

但是问题在于这里。正如您在下面的屏幕上看到的那样,I的增长率为183%:一个错误的增长率!

然而,当手动计算时,从1到4,b从4到2,增长应该是:1/5 * 300% + 4/5 * -50% = 20%(我从5变成6)。

这是因为所做的计算是4/6 * 300% + 2/6 * -50% = 183%。该方法是根据新系数计算加权平均值,而不是理论上应该根据旧系数计算。

是否有一种方法,在聚合到父类时获得正确的增长率?

非常感谢您的帮助,如果需要进一步帮助,请告诉我。

1个回答

2

我找不到像你所描述的那样传递数据的方法。但是,我想出了一个解决方法。

这需要使用plotly.io

我想指出的是,当您将父级从183.333333更改为20%时,您具有的颜色对比度会丢失 - 实际上,该父级几乎与II相同,因为值为20和0,而'a'为300,低点仅为-50。

此外,我添加了px.Constant,以便您不会得到根(父母的黑色背景)的无用悬停标签。

输入图像描述

输入图像描述

import pandas as pd
import plotly.express as px
import plotly.io as pio

fig = px.treemap(df,  path=[px.Constant('Total'), 'parent', 'variable'], 
                 values = 'value_2', color='growth', 
                 color_continuous_scale='plasma')

现在当您使用pio时,您将创建一个外部文件,但这是唯一的方法(除了使用Jupyter),可以向您的绘图添加Javascript。这将自动在您的浏览器中打开,就像fig.show()一样,不同之处在于此将反映父级I在悬停数据中增长了20%
pio.write_html(fig, 'index.html', auto_open = True, div_id = 'thisPlot', 
               include_mathjax = 'cdn', include_plotlyjs = 'cdn', full_html = True, 
               post_script = "setTimeout(function() {" +
               "el = document.getElementById('thisPlot');" +
               "el.data[0].marker.colors[3] = 20;       /* change the calc value */" + 
               "Plotly.newPlot(el, el.data, el.layout); /* re-plot it */"
               "}, 200)")

您可能会注意到需要更改的是el.data[0].marker.colors[3],这是父级I
在进行此更改之前,以下是在el.data[0].marker.colors中捕获的所有数据:[300, -50, 0, 183.33333333333334, 0, 100]
顺便说一下,每当我使用pio.write_html时,我总是将文件命名为相同的名称,因此它总是在覆盖自身。我个人对保存的文件不感兴趣,只关心post_script的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接