Matplotlib 绘图顺序错误[重复]

2025-03-06 08:52:00
admin
原创
88
摘要:问题描述:基本上我有两个数组,一个包含 x 轴的值,另一个包含 y 轴的值。问题是,当我这样做时plt.semilogy(out_samp,error_mc) 我明白了这没有任何意义。这是因为绘图函数会绘制 x 数组中遇到的所有内容,而不关心它是否按升序排序。我该如何对这两个数组进行排序,以便 x 数组按增加...

问题描述:

基本上我有两个数组,一个包含 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 数组对两个数组进行排序。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3878  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2714  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   49  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   49  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   49  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用