在绘图中,我可以创建一个直方图,例如在此文档中的示例代码中:
import plotly.express as px
df = px.data.tips()
fig = px.histogram(df, x="total_bill")
fig.show()
我的问题是如何获取直方图的数据值?据我所知,这个问题应该等同于如何访问跟踪的值? (谷歌也没有提供帮助)
我可以使用 numpy 重做直方图:
import numpy as np
np.histogram(df.total_bill)
但这并不总是会产生相同的存储桶,而且它会重新执行所有有时昂贵的计算来创建直方图。
我对您问题的理解是您希望获得直方图中显示的准确间隔和计数。对于
px.data.tips()
的较小子集,如下:
从图表中读出这些值将是:
counts = [2, 4, 3, 1]
bins = [5, 15, 25, 35, 45]
没有直接的方法可以做到这一点,但这并不意味着这是不可能的。至少如果你愿意使用很棒的
fig.full_figure_for_development()
和 little numpy。
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)
[2 4 3 1] [ 5 15 25 35 45]
我猜你会喜欢能够做的是:
运行:
fig.data[0].count
并得到:
[2, 4, 3, 1]
但你会得到的最接近的是:
运行:
fig.data[0].x
并得到:
[15.53, 10.07, 12.6 , 32.83, 35.83, 29.03, 27.18, 22.67, 17.82,
18.78]
这些只是输入的原始值
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
会给你:
histogram.XBins({
'end': 45, 'size': 10, 'start': 5
})
现在你已经知道了足够的知识,可以用一点 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)
在同一个 Plotly Histogram 文档中,有一个名为“访问计数 y 轴值”的部分,它解释了 y 值是在图形渲染时由浏览器中的 JavaScript 计算的,因此您无法在图形对象中访问它(例如,通过 fig.layout
或
fig.data
,您可以尝试其他类型的图表)他们建议您使用 np.histogram
自行计算计数和分箱,然后将这些值传递给
px.bar
以确保您的直方图与您想要的存储桶匹配。import plotly.express as px
df = px.data.tips()
fig = px.histogram(df, x="total_bill")
fig.show()
print(df.groupby('total_bill').total_bill.agg('count').to_frame('COUNT').reset_index().head())
total_bill COUNT
0 3.07 1
1 5.75 1
2 7.25 2
3 7.51 1
4 7.56 1
我猜plotly做了类似的事情,然后添加一些其他分组以将每个直方图条中特定范围内的值堆叠在一起。