测试数组:
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
答案 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()
或者,如果您的数据已经是类似于您的示例的数组形式,请执行以下操作:
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()
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))