首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用plt.loglog在matplotlib中用斜率绘制直线

如何使用plt.loglog在matplotlib中用斜率绘制直线
EN

Stack Overflow用户
提问于 2020-05-10 10:16:09
回答 2查看 975关注 0票数 0

这里我需要绘制一个频率和一个斜率为-5/3的简单直线。

问题是,主要的情节是使用plt.loglog(),当我想显示行时,它没有给我任何东西或奇怪的东西。

这是它的照片。我已经画好了右边的那个,而我想要的是左边的那个。

我已经使用了np.linspace和其他一些东西,但是我无法解决这个问题。此外,还不清楚在哪个点,我有频率图的第一个和结束。这也是我不能使用“np.linspace”的另一个原因。有谁可以帮我?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-10 17:09:47

非常感谢你的关注。我试过了你的代码,但我发现也许有更好的方法来处理我的数据集。所以我做了这个:

  • 将dataset类更改为np.array(),并在其上具有np.log()函数:
代码语言:javascript
复制
x = ... # type(x) = list
y = ... # type(y) = list
.
.
.
x = np.log(np.array(x))
y = np.log(np.array(y))

在这种情况下,我不再需要在计算中使用plt.loglog()np.log()np.exp()

  • 查找x和y的最小值、最大值和平均值:
代码语言:javascript
复制
ymin, ymax = ([y.min(), y.max()])
ymid = (ymin + ymax) / 2
xmin, xmax = ([x.min(), x.max()])
xmid = (xmin + xmax) / 2
  • 使用np.linspace()作为rest:
代码语言:javascript
复制
slope = - 5 / 3
x1 = np.linspace(xmin, xmax)
y1 = slope * (x1 - xmid) + ymid
ax.plot(x1, y1, 'r')

得到了我想要的结果。

结果

编辑:原版的地块。

因此,最好在频谱中使用plt.loglog()图,我编辑了以下内容:

  • 将回x和y改为正常np.array()
代码语言:javascript
复制
x = array(...)
y = array(...)
  • 找出x和y的中间有直线的中心,使用简单的直线方程,然后用np.exp()绘制这条线。
代码语言:javascript
复制
ymin, ymax = log([y.min(), y.max()])
ymid = (ymin + ymax) / 2
xmin, xmax = log([x.min(), x.max()])
xmid = (xmin + xmax) / 2

slope = - 5 / 3
y1 = slope * (xmin - xmid) + ymid
y2 = slope * (xmax - xmid) + ymid
ax.plot(exp([xmin, xmax]), exp([y1, y2]), 'r')
plt.loglog()

结果

正如你现在所看到的,我们有了原状的地块。

票数 1
EN

Stack Overflow用户

发布于 2020-05-10 14:09:20

这是一种可能的方法。所有的计算都发生在日志空间。将点转换回线性空间进行绘制。当matplotlib绘制一条直线时,给定的两点总是一样的直线,独立于轴的变换,只需要两个点。

步骤:

  • 找到曲线的最低和最高值(y0,y1);这些值定义了斜线的延伸。
  • 在曲线中心附近找一个点(mid_x,mid_y);这个点是一个锚点,用来知道斜线应该往哪里走。
  • 查找与斜线(mid_x,mid_y)对应的x值,然后转到y0和y1
代码语言:javascript
复制
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(8, 8))
# first create some toy data roughly resembling the example plot
x = np.linspace(10, 2000, 1000)
y = np.random.normal(2000 / x ** np.linspace(.7, .55, x.size), 100 / x ** .7)
ax.plot(x, y)
y0, y1 = np.log([y.min(), y.max()])
# mid_x, mid_y = np.log([x[x.size // 2],  y[y.size // 2]])
mid_x, mid_y = (np.log(x.min()) + np.log(x.max())) / 2, (y0 + y1) / 2
slope = -5 / 3
x0 = mid_x + slope * (y0 - mid_y)
x1 = mid_x + slope * (y1 - mid_y)
ax.plot(np.exp([x0, x1]), np.exp([y0, y1]), color='crimson')

plt.loglog()
plt.show()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61710306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档