如何使matplotlib绘制不连续的线段?

时间:2014-06-20 14:32:28

标签: python matplotlib

测试数组:

  import numpy as np

  ta = np.array([[[ 1.,  0.],
                  [1.,   1.]],

                 [[ 2.,  1.],
                  [ 2.,  2.]],

                 [[ 5.,  5.],
                  [ 5.,  6.]]])

ta的每个元素对应于两个端点(如果是线段)。例如:

ta[0] = np.array([[ 1,  0],
                  [1,   1]])

是一个线段,其中一个端点位于(1,0),另一个端点位于(1,1)

如何让matplotlib绘制出这些线段,同时保持它们不连续

以下没有成功:

from matplotlib import pyplot as plt

ta_xs = ta[:,:,0]
ta_ys = ta[:,:,1]

plt.plot(np.insert(ta_xs, np.arange(0, len(ta_xs)), np.nan), np.insert(ta_ys, np.arange(0, len(ta_ys)), np.nan))

以上尝试的解决方案的灵感来自这个问题的答案:How to drop connecting lines where the function is discontinuous

3 个答案:

答案 0 :(得分:2)

插入NaN是一种非常好的方法,但如果您想要绘制多个垂直线段,则更容易使用plt.vlines

例如:

import matplotlib.pyplot as plt

x = [1, 2, 5]
ymin = [0, 1, 5]
ymax = [1, 2, 6]

plt.margins(0.05) # So the lines aren't at the plot boundaries..
plt.vlines(x, ymin, ymax, color='black', linewidth=2)
plt.show()

enter image description here

或者,如果您的数据已经是类似于您的示例的数组形式,请执行以下操作:

import numpy as np
import matplotlib.pyplot as plt

ta = np.array([[[ 1.,  0.],
              [1.,   1.]],
             [[ 2.,  1.],
              [ 2.,  2.]],
             [[ 5.,  5.],
              [ 5.,  6.]]])
x, y = ta.T

plt.margins(0.05)
plt.plot(x, y, linewidth=2, color='black')
plt.show()

enter image description here

plot会将以x和y传入的二维数组解释为单独的行。

答案 1 :(得分:0)

你是在正确的轨道上,但要确保你有一个浮点数组,否则你不能插入nan。我得到一个例外:ValueError: cannot convert float NaN to integer。尝试:

np.insert(ta_xs.astype(float), np.arange(1, len(ta_xs)), np.nan)

抓一点。试试这个:

tas_for_plotting = np.concatenate([ta, nan*np.ones_like(ta[:,:1])], axis=1)
plot(tas_for_plotting[...,0].flat, tas_for_plotting[...,1].flat)

答案 2 :(得分:0)

plt.plot(np.insert(ta_xs, np.arange(2, len(ta_xs), 2), np.nan), np.insert(ta_ys, np.arange(2, len(ta_ys), 2), np.nan))