我们如何在 Z 轴 python 上绘制带有频率值的曲面图

Posted

技术标签:

【中文标题】我们如何在 Z 轴 python 上绘制带有频率值的曲面图【英文标题】:how do we plot plotly surface plots with frequency values on Z axis python 【发布时间】:2021-09-22 23:20:51 【问题描述】:

我有下面给出的数据,我想在 z 轴上绘制具有 x 和 y 值频率的交互式曲面图

**apples**  **oranges**
    0           1
   10           2
   20           1
   10           1
   10           1

我试过下面的代码

import plotly.graph_objects as go
import pandas as pd
import numpy as np
#
z_data = df.groupby(['apples', 'oranges']).count()

x, y = df['apples'], df['oranges']
sh_0, sh_1 = z.shape
fig = go.Figure(data=[go.Surface(z=z, x=x, y=y)])
#fig.update_layout(title='histogram_trial', autosize=True)

fig.update_layout(title='Mt Bruno Elevation', autosize=False,
                  width=500, height=500,
                  margin=dict(l=65, r=50, b=65, t=90))
fig.show()

上面的代码给了我空白输出。请告诉我如何获得 z 轴的计数

【问题讨论】:

当你说z轴上x和y值的频率时,你能解释一下你的意思吗?每个 x 和 y 值的预期 z 值是多少? 嗨 Derek,我的 z 值应该如下所示 apples oranges ** z** 0 1 1 10 2 1 20 1 1 10 1 2 【参考方案1】:

您的代码存在一些问题。

    DataFrameGroupBy.count 不会计算任何东西,因为你 没有非键列受聚合影响。使用任一 DataFrameGroupBy.sizeDataFrame.value_counts

    plotly.graph_objects.Surface 有特殊输入要求:

    描述表面坐标的数据设置在z中。 z 中的数据应该是一个二维列表。 xy 中的坐标可以是一维列表或二维列表(例如,绘制参数曲面)。如果xy 中未提供,则假定 x 和 y 坐标从 0 开始以单位步长为线性。

如果不满足 (2),则只能绘制 Scatter3dMesh3d。但是使用DataFrame.pivot_table,您可以获得正确形状的数据。

import numpy as np
import pandas as pd
import plotly.graph_objects as go

raw_df = pd.DataFrame(np.random.randint(0, 10, size=(50, 2)), columns=['x', 'y'])
df = raw_df.value_counts(['x', 'y']).reset_index(name='z')
surf_df = df.pivot_table(index=['y'], columns=['x'], values=['z'], fill_value=0)

fig = go.Figure()
fig.add_trace(go.Scatter3d(x=df['x'], y=df['y'], z=df['z'], mode='markers'))
fig.add_trace(go.Surface(z=surf_df))
fig

【讨论】:

以上是关于我们如何在 Z 轴 python 上绘制带有频率值的曲面图的主要内容,如果未能解决你的问题,请参考以下文章

Seaborn:带有频率的计数图()

带有上标的 matplotlib 刻度轴表示法

python 2.7中对数刻度的最佳拟合线

如何使用 matplotlib 在日期时间轴上绘制一个矩形?

Python。在 Seaborn Facetgrid 上使用两个 y 轴绘制线图和条形图

如何从 3 轴加速度计数据中获取运动大小