Matplotlib 绘图顺序错误[重复]
- 2025-03-06 08:52:00
- admin 原创
- 88
问题描述:
基本上我有两个数组,一个包含 x 轴的值,另一个包含 y 轴的值。问题是,当我这样做时
plt.semilogy(out_samp,error_mc)
我明白了
这没有任何意义。这是因为绘图函数会绘制 x 数组中遇到的所有内容,而不关心它是否按升序排序。我该如何对这两个数组进行排序,以便 x 数组按增加的值排序,y 轴按相同的方式排序,以便点相同但绘图连接在一起,这样就不会造成混乱?
解决方案 1:
对两个数据列表zip
进行排序和合并更加容易。zip
例子:
xs = [...]
ys = [...]
xs, ys = zip(*sorted(zip(xs, ys)))
plot(xs, ys)
请参阅此处的 zip 文档:https://docs.python.org/3.5/library/functions.html#zip
解决方案 2:
绘图前按 x 轴的值排序。这是 MWE。
import itertools
x = [3, 5, 6, 1, 2]
y = [6, 7, 8, 9, 10]
lists = sorted(itertools.izip(*[x, y]))
new_x, new_y = list(itertools.izip(*lists))
# import operator
# new_x = map(operator.itemgetter(0), lists) # [1, 2, 3, 5, 6]
# new_y = map(operator.itemgetter(1), lists) # [9, 10, 6, 7, 8]
# Plot
import matplotlib.pylab as plt
plt.plot(new_x, new_y)
plt.show()
对于小数据,zip
(正如其他回答者所提到的)就足够了。
new_x, new_y = zip(*sorted(zip(x, y)))
结果,
解决方案 3:
对列表进行排序的另一种方法是使用 NumPy 数组并进行np.sort()
排序。使用数组的优点是在计算 y=f(x) 等函数时进行矢量化操作。以下是绘制正态分布的示例:
不使用排序数据
mu, sigma = 0, 0.1
x = np.random.normal(mu, sigma, 200)
f = 1/(sigma * np.sqrt(2 * np.pi)) *np.exp( - (x - mu)**2 / (2 * sigma**2) )
plt.plot(x,f, '-bo', ms = 2)
输出 1
使用 np.sort()x
这允许在计算正态分布时直接使用排序数组。
mu, sigma = 0, 0.1
x = np.sort(np.random.normal(mu, sigma, 200))
# or use x = np.random.normal(mu, sigma, 200).sort()
f = 1/(sigma * np.sqrt(2 * np.pi)) *np.exp( - (x - mu)**2 / (2 * sigma**2) )
plt.plot(x,f, '-bo', ms = 2)
或者,如果你已经有未排序的 x 和 y 数据,你可以使用numpy.argsort
后验对它们进行排序
mu, sigma = 0, 0.1
x = np.random.normal(mu, sigma, 200)
f = 1/(sigma * np.sqrt(2 * np.pi)) *np.exp( - (x - mu)**2 / (2 * sigma**2) )
plt.plot(np.sort(x), f[np.argsort(x)], '-bo', ms = 2)
请注意,上面的代码使用了sort()
两次:首先是 with np.sort(x)
,然后是 with f[np.argsort(x)]
。总sort()
调用次数可以减少到一次:
# once you have your x and f...
indices = np.argsort(x)
plt.plot(x[indices], f[indices], '-bo', ms = 2)
在这两种情况下,输出都是
输出 2
解决方案 4:
就这么做
list=zip(*sorted(zip(*(x,y))))
plt.plot(*list)
sorted 函数将根据第一个参数即 x 值进行排序
解决方案 5:
我认为您需要对一个数组进行排序,另一个数组也应该基于第一个数组进行排序。我从其他一些 stack overflow 问题中得到了这个解决方案。这很可能应该是您的解决方案。
out_samp,error_mc=zip(*sorted(zip(out_samp,error_mc)))
现在绘制这两个值,您将得到一个正确的图表。
解决方案 6:
您可以将数组转换为 numpy 数组,然后在第一个数组上使用 argsort,获取该数组并使用 argsort 数组对两个数组进行排序。
扫码咨询,免费领取项目管理大礼包!