簡體   English   中英

plotly.express - Python中treemap的聚合計算方法

[英]Aggregation calculation method for treemap in plotly.express - Python

提前感謝那些願意幫助我的人。 這是我第一次問這個問題,因為我已經在這個問題上苦苦掙扎了好幾天! 幫助我解決這個問題的人將獲得永恆的榮耀!

讓我用幾行代碼和屏幕來解釋我的問題。

我想創建一個樹狀圖來顯示 2 個日期之間的值增長。 為了更精確,我希望此樹形圖: - 具有大小與日期 2 的值 x 成比例的正方形,並根據顯示此值 x 從日期 1 到日期 2 的增長的比例進行着色。

讓我們考慮以下示例:

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%:錯誤的增長!

但是,手動計算時,a從1到4,b從4到2,增長應該是:1/5 * 300% + 4/5 * -50% = 20%(我從5到6) .

這是由於微積分是 4/6 * 300% + 2/6 * -50% = 183%。 該方法正在計算新系數的加權平均值,而不是理論上應該計算的以前的系數。

有沒有辦法在聚合到父級 class 時獲得正確的增長?

非常感謝您的幫助,如果我能提供進一步的幫助,請告訴我

當您試圖描述數據時,我找不到一種方法來獲取數據。 但是,我確實想出了一個解決方法。

這需要使用plotly.io

我想指出的是,當您將父級從 183.333333 更改為 20% 時,您與 colors 的鮮明對比就消失了——本質上,父級與 II 的顏色幾乎相同,因為值為 20 和 0,而'a' 為 300,最低僅為 -50。

此外,我添加了px.Constant這樣你就不會得到一個真正無用的 hover label 作為根(父母的黑色背景父母)。

在此處輸入圖像描述

在此處輸入圖像描述

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 添加到您的 plot 的唯一方法。這將在您的瀏覽器中自動打開,如fig.show() ,除了這將反映即父I在hover數據中有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]

順便說一句,每當我 go 的路線pio.write_html ,我總是命名文件相同的東西,所以它總是覆蓋自己。 我個人對保存的文件不感興趣,只對post_script的結果感興趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM