【问题标题】:Extract (x,y) values from a line graph从折线图中提取 (x,y) 值
【发布时间】:2021-07-15 16:27:58
【问题描述】:

假设我有 2 组数据,我使用 plt.plot 绘制图形。

import matplotlib.pyplot as plt
import numpy as np

x=range(5,46,5)
y=[1.60,1.56,1.54,1.53,1.53,1.58,1.70,1.97,2.68]


plt.plot(x,y)

如何获取 plt.plot 创建的折线图的 x,y 值?

为清楚起见进行编辑:我想要做的是获取 plt.plot 创建的线的坐标,而不是获取用于创建图形的数据。

为了更清楚而进行编辑:我想在 pyplot 绘制的线中获取我的每个 (x,y) 对之间的点的坐标。

【问题讨论】:

  • 您在寻找list(zip(x,y))吗?
  • 您已经拥有xy 变量。你还需要什么?
  • 你好@stackoverflowuser2010。我想要做的是获取由 plt.plot 创建的线的坐标,而不是获取用于创建图形的数据。
  • @user399840:数据显示曲线。您想要什么:(a) 每个 (x, y) 对之间的点,或 (b) 一些描述曲线的多项式的系数?
  • @stackoverflowuser2010 (a) 一个!

标签: python matplotlib graph


【解决方案1】:

Axes 对象具有属性 transData。这个transformation可以用来把数据坐标转换成显示坐标:

x=range(5,46,5)
y=[1.60,1.56,1.54,1.53,1.53,1.58,1.70,1.97,2.68]

plt.gca().set_xlim(5,46)
plt.gca().set_ylim(1.5,3)
plt.plot(x,y)

print(plt.gca().transData.transform(list(zip(x,y))))

最后一行打印以显示坐标表示的数据点数组:

[[ 54.          50.496     ]
 [ 94.82926829  44.6976    ]
 [135.65853659  41.7984    ]
 [176.48780488  40.3488    ]
 [217.31707317  40.3488    ]
 [258.14634146  47.5968    ]
 [298.97560976  64.992     ]
 [339.80487805 104.1312    ]
 [380.63414634 207.0528    ]]

这个输出意味着第一个数据点(5, 1.60)显示在(54.0, 50.495),最后一个数据点(45, 2.69)显示在(380.634, 207.052)

编辑:此列表中两个数据点之间的剩余点可以使用interp1d 计算:

display_coords = plt.gca().transData.transform(list(zip(x,y)))
from scipy.interpolate import interp1d
f = interp1d(display_coords[:,0], display_coords[:,1])
display_x = np.linspace(min(display_coords[:,0]), max(display_coords[:,0]), num=100, endpoint=True)
list(zip(display_x, f(display_x)))

结果:

[(54.0, 50.49599999999998),
 (57.29933481152993, 50.0274424242424),
 (60.59866962305987, 49.55888484848483),
 (63.8980044345898, 49.09032727272725),
 (67.19733924611974, 48.62176969696967),
...
 (367.43680709534374, 173.78521212121217),
 (370.7361419068736, 182.102109090909),
 (374.0354767184036, 190.41900606060602),
 (377.3348115299335, 198.735903030303),
 (380.63414634146346, 207.0528)]

实际值取决于显示、设置等,可能会有所不同。

【讨论】:

  • 感谢您的回答!然而,这仍然不是我想要的。我想获取 pyplot 绘制的线中每个 (x,y) 对之间的点的坐标。我很抱歉没有清楚地表达它。
  • @user399840 我添加了在数据点之间插入 (x,y) 对的代码
【解决方案2】:

您可以从轴访问Lines2D 对象。然后可以使用 Lines2D.get_data() 函数访问行数据,该函数返回 x 和 y 数组值的元组。

x=range(5,46,5)
y=[1.60,1.56,1.54,1.53,1.53,1.58,1.70,1.97,2.68]
fig, ax = plt.subplots(figsize=(10,6))
ax.plot(x,y)

ax.lines[0].get_data()

>>> (array([ 5, 10, 15, 20, 25, 30, 35, 40, 45]),
 array([1.6 , 1.56, 1.54, 1.53, 1.53, 1.58, 1.7 , 1.97, 2.68]))

【讨论】:

猜你喜欢
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多