从直方图中获取值或从迹线中获取值

ntg*_*ntg 3 histogram plotly plotly-python plotly-express

在情节中,我可以创建一个直方图,例如文档中的示例代码

import plotly.express as px
df = px.data.tips()
fig = px.histogram(df, x="total_bill")
fig.show()
Run Code Online (Sandbox Code Playgroud)

结果是: 在此输入图像描述

我的问题是如何获取直方图的数据值?据我所知,这个问题应该等同于如何访问跟踪的值?(谷歌也没有提供帮助)

我可以使用 numpy 重做直方图:

import numpy as np
np.histogram(df.total_bill)
Run Code Online (Sandbox Code Playgroud)

但这并不总是会产生相同的存储桶,而且它会重新执行所有有时昂贵的计算来创建直方图。

在此输入图像描述

ves*_*and 7

我对您问题的理解是您希望获得直方图中显示的准确间隔和计数。对于 的较小子集px.data.tips(),如下:

在此输入图像描述

从图表中读出这些值将是:

counts = [2, 4, 3, 1]
bins = [5, 15, 25, 35, 45]
Run Code Online (Sandbox Code Playgroud)

没有直接的方法可以做到这一点,但这并不意味着这是不可能的。至少如果你愿意使用很棒的fig.full_figure_for_development()有点麻木的。

代码亮点(完整片段在最后)

xbins = f.data[0].xbins
plotbins = list(np.arange(start=xbins['start'], stop=xbins['end']+xbins['size'], step=xbins['size']))
counts, bins = np.histogram(list(f.data[0].x), bins=plotbins)
Run Code Online (Sandbox Code Playgroud)

输出:

[2 4 3 1] [ 5 15 25 35 45]
Run Code Online (Sandbox Code Playgroud)

所有细节:

我猜你希望能够做的是这样的:

跑步:

fig.data[0].count
Run Code Online (Sandbox Code Playgroud)

并得到:

[2, 4, 3, 1]
Run Code Online (Sandbox Code Playgroud)

但你会得到的最接近的是:

跑步:

fig.data[0].x
Run Code Online (Sandbox Code Playgroud)

并得到:

[15.53, 10.07, 12.6 , 32.83, 35.83, 29.03, 27.18, 22.67, 17.82,
   18.78]
Run Code Online (Sandbox Code Playgroud)

这些只是输入的原始值df['total_bill'].tail(10)。所以 DerekO 是对的,其余的由 javascript 处理。但fig.full_figure_for_development()会:

[...] 返回一个新的 go.Figure 对象,该对象预填充了您提供的相同值以及 Plotly.js 计算的所有默认值,以便您了解更多关于哪些属性控制图形的每个细节和如何定制它们。

所以运行f = fig.full_figure_for_development(warn=False),然后:

f.data[0].xbins
Run Code Online (Sandbox Code Playgroud)

会给你:

histogram.XBins({
    'end': 45, 'size': 10, 'start': 5
})
Run Code Online (Sandbox Code Playgroud)

现在你已经知道了足够的知识,可以用一点 numpy 在你的图中获得相同的值:

完整代码:

import plotly.express as px
import numpy as np

df = px.data.tips()
df = df.tail(10)
fig = px.histogram(df, x="total_bill")
f = fig.full_figure_for_development(warn=False)

xbins = f.data[0].xbins
plotbins = list(np.arange(start=xbins['start'], stop=xbins['end']+xbins['size'], step=xbins['size']))
counts, bins = np.histogram(list(f.data[0].x), bins=plotbins)
print(counts, bins)
Run Code Online (Sandbox Code Playgroud)


Der*_*k O 5

在同一个 Plotly Histogram 文档中,有一个名为Accessing the counts yaxis value 的部分,它解释了 y 值是在图形渲染时由浏览器中的 JavaScript 计算的,因此您无法在图形对象中访问它(例如、通过fig.layoutfig.data,您可以尝试其他类型的图表)

他们建议您自己使用 计算计数和分箱np.histogram,然后将这些值传递给px.bar以确保您的直方图与您想要的存储桶匹配。