当前位置: 首页 > 知识库问答 >
问题:

Matplotlib:ax.format_coord()在3D trisurf图-返回(x, y, z)而不是(方位角,海拔)?

卫博雅
2023-03-14

我试图重做这个已经回答了Matplotlib-plot\u surface的问题:获取写在右下角的x、y、z值,但无法获得相同的结果,如前所述。所以,我有这样一个代码:

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from plyfile import PlyData, PlyElement

#Handle the "onclick" event
def onclick(event):
    print('%s click: button=%d, x=%d, y=%d, xdata=%f, ydata=%f' %
          ('double' if event.dblclick else 'single', event.button,
           event.x, event.y, event.xdata, event.ydata))
    print(gety(event.xdata, event.ydata))

#copied from https://stackoverflow.com/questions/6748184/matplotlib-plot-surface-get-the-x-y-z-values-written-in-the-bottom-right-cor?rq=1
def gety(x,y):
    s = ax.format_coord(x,y)
    print(s) #here it prints "azimuth=-60 deg, elevation=30deg"
    out = ""
    for i in range(s.find('y')+2,s.find('z')-2):
        out = out+s[i]
    return float(out)

#Read a PLY file and prepare it for display
plydata = PlyData.read("some.ply")
mesh = plydata.elements[0]
triangles_as_tuples = [(x[0], x[1], x[2]) for x in plydata['face'].data['vertex_indices']]
polymesh = np.array(triangles_as_tuples)

#Display the loaded triangular mesh in 3D plot
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_trisurf(mesh.data['x'], mesh.data['y'], mesh.data['z'], triangles=polymesh, linewidth=0.2, antialiased=False)
fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()

这样,可以正确显示三角形曲面(尽管速度较慢)。我可以在右下角看到曲面的(x,y,z)坐标,同时将鼠标悬停在绘图上。但是,当我尝试通过单击鼠标(通过连接的事件处理程序)获取这些坐标时,ax。format\u coord(x,y)fction返回的不是一组笛卡尔坐标,而是一组“方位角=-60度,仰角=30度”,无论我在绘图中的何处单击,直到曲面旋转为止。然后返回另一个值。从这里,我想这些是当前视图的球坐标,而不是点击点,出于某种原因。。。

有人能找出,我做错了什么吗?我怎么才能得到表面上的笛卡尔坐标?

仅供参考:这一切都与我之前的问题Python有关:3D中的图形输入,这被认为过于宽泛和通用。

共有1个答案

邹宏峻
2023-03-14

按下的鼠标按钮是ax的触发器。format\u coord返回三维绘图上的角度坐标,而不是笛卡尔坐标。因此,一个选择是让ax。format\u coord(格式协调)认为没有按下任何按钮,在这种情况下,它将根据需要返回通常的笛卡尔x、y、z坐标。

要实现这一点,即使您单击了鼠标按钮,也需要设置ax。在调用该函数时,按下按钮(存储当前鼠标按钮)以显示不合理的内容。

def gety(x,y):
    # store the current mousebutton
    b = ax.button_pressed
    # set current mousebutton to something unreasonable
    ax.button_pressed = -1
    # get the coordinate string out
    s = ax.format_coord(x,y)
    # set the mousebutton back to its previous state
    ax.button_pressed = b
    return s
 类似资料:
  • 问题内容: 我将如何在SELECT查询中反转此路径: 为了 其中/是定界符,并且在一行中可以有许多定界符 问题答案: 最简单的方法可能是编写一个存储的pl / sql函数,但是可以单独使用SQL(Oracle)来完成。 这将分解子路径中的路径: 然后,我们使用来重构反向路径:

  • 问题内容: 我想知道为什么’Y’返回2019,而’y’返回2018在SimpleDateFormat: System.out.println(new SimpleDateFormat(“Y”).format(new Date())); // prints 2019 System.out.println(new SimpleDateFormat(“y”).format(new Date())); /

  • 我有以下功能: 此代码给出了

  • 这部分是学术性的,就我的目的而言,我只需要四舍五入到小数点后两位;但我很想知道发生了什么会产生两种略有不同的结果。 这是我编写的测试,将其缩小到最简单的实现: 但它失败了,输出如下: 有谁能详细解释一下是什么原因导致 我在一个答案中寻找的一些要点是:精度损失在哪里?哪种方法是首选的,为什么?哪一个实际上是正确的?(在纯数学中,不可能两者都是对的。也许两者都是错的?)对于这些算术运算,有没有更好的解

  • 契约已更改为返回,而不是从androidx开始的。活动版本1.2.0-alpha05。如何使用内置的AndroidResultContracts返回的contract访问和显示用户刚刚拍摄的照片?

  • 问题内容: 做这个: 意思是这样的: 如果是这样,我对Dive Into Python中的示例5.14 完全感到困惑。密钥如何既等于“名称”又等于项目?另一方面,“和项目”是否只是问项目是否作为变量存在? 问题答案: 意味着。 请记住,这有几种可能。例如将评估为。