首页 > 解决方案 > 为什么 matplotlib.pyplot 在我的图中给了我很多行而不是一个?

问题描述

我正在生成数据并将它们存储在一个 numpy 数组中。我也在计算一个变量并将这些变量存储在另一个数组中。它们具有不同的形状和 ndim,但它们是可绘制的,因为我用另一个具有相同逻辑的简单代码进行了尝试。

import numpy as np
import matplotlib.pyplot as plt

a = np.array([0.05718623, 0.05446883, 0.04395619, 0.03004849])
b = np.array([[0.61745], [0.45825], [0.80061], [0.3719]])
plt.yscale('log')
plt.xscale('log')
plt.plot(a,b)
plt.show()

在此处输入图像描述

当我想使用以下代码用我存储的数据绘制两个数组时:

works = [Data]
probability = [Data2]
plt.yscale('log')
plt.xscale('log')
plt.plot(probability, works)

我明白了:

在此处输入图像描述

但是,当我在 plt.plot() 中放置一个“bo”时,我得到了这个:

works = [Data]
probability = [Data2]
plt.yscale('log')
plt.xscale('log')
plt.plot(probability, works, 'bo')

在此处输入图像描述

所以我不想要蓝点。相反,我想要一条像蓝点一样的曲线。我在这里想念什么?这背后的问题是什么?或者这个问题需要我如何产生我的数据?

PS:Data.ndim = (1000,) Data2.ndim = (1000,1)

标签: pythonmatplotlib

解决方案


plt.plot(probability, works)按照输入数组中列出的顺序将所有点与线段连接起来。

例如,plt.plot([1,2,3], [1,4,9])按照给定的顺序在 (1,1)、(2,4) 和 (3, 9) 之间建立一个很好的分段线连接。另一方面,plt.plot([1,3,2], [1,9,4])将 (1,1) 与 (3, 9) 与线段连接起来,将 (3, 9) 和 (2, 4) 与线段连接起来——我们在后一种情况下会得到一个丑陋的图。

正如 JohanC 所建议的,您需要对数据进行排序。仅对第一个数组进行排序将破坏对应关系:Data[0]对应于Data2[0]. 因此,我们需要排序Data,但保留对应关系。zip(Data, Data2)冻结通信。sorted在 Python 中首先按第一个索引排序,即它会对 Data.Data 进行排序。最后,我们需要撤消zip并取回我们的两个数组。 zip(*sorted(zip(Data, Data2))正是这样做的。


推荐阅读