Python的Matplotlib以错误的顺序绘图

10 python matplotlib

基本上我有两个数组,一个包含x轴的值,第二个包含y轴的值.问题是,当我这样做

plt.semilogy(out_samp,error_mc)
Run Code Online (Sandbox Code Playgroud)

我明白了

在此输入图像描述

这没有任何意义.这是因为绘图函数绘制了在x数组中遇到的所有内容,而不是关心它是否按升序排序.我如何对这两个数组进行排序,以便通过增加值对y数组进行排序,并以相同的方式对y轴进行排序,使得点相同,但是连接的图是为了使它不会造成这种混乱?

先感谢您!

Spa*_*ine 8

在绘图之前按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()
Run Code Online (Sandbox Code Playgroud)

对于小数据,zip(如其他回答者所提到的)就足够了.

new_x, new_y = zip(*sorted(zip(x, y)))
Run Code Online (Sandbox Code Playgroud)

结果,

在此输入图像描述


Hid*_*dde 8

轻松地对两个数据列表进行zip排序,排序和取消排序zip

例:

xs = [...]
ys = [...]

xs, ys = zip(*sorted(zip(xs, ys)))

plot(xs, ys)
Run Code Online (Sandbox Code Playgroud)

请参阅此处的zip文档:https : //docs.python.org/3.5/library/functions.html#zip

  • 你应该是最佳答案 (3认同)

She*_*ore 6

对列表进行排序的另一种方法是使用 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)
Run Code Online (Sandbox Code Playgroud)

输出 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)
Run Code Online (Sandbox Code Playgroud)

或者,如果您已经将 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)
Run Code Online (Sandbox Code Playgroud)

请注意,上面的代码使用了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)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,输出都是

输出 2

在此处输入图片说明