【问题标题】:How do you create line segments between two points?如何在两点之间创建线段?
【发布时间】:2016-04-14 16:46:45
【问题描述】:

我有这段代码可以标出要点:

import matplotlib.pyplot as plot
from matplotlib import pyplot

all_data = [[1,10],[2,10],[3,10],[4,10],[5,10],[3,1],[3,2],[3,3],[3,4],[3,5]]
x = []
y = []
for i in xrange(len(all_data)):
    x.append(all_data[i][0])
    y.append(all_data[i][1])
plot.scatter(x,y)

pyplot.show()

但我希望所有可能的行看起来像这样:

我已经尝试过 matplotlib 路径,但它对我来说效果不佳。

【问题讨论】:

  • 不确定 matplotlib 问题,但您可以使用 x, y = zip(*all_data) 而不是循环(如果您需要列表而不是元组,则可以使用 x, y = map(list, zip(*all_data)))来节省一些代码行。

标签: python matplotlib


【解决方案1】:

这可以优化,但它可以工作:

for point in all_data:
    for point2 in all_data:
        pyplot.plot([point[0], point2[0]], [point[1], point2[1]])

【讨论】:

  • 如何优化? pyplot.plot() 调用是否非常昂贵?我可以只调用一次吗??
【解决方案2】:
import matplotlib.pyplot as plt
import itertools 

fig=plt.figure()
ax=fig.add_subplot(111)
all_data = [[1,10],[2,10],[3,10],[4,10],[5,10],[3,1],[3,2],[3,3],[3,4],[3,5]]
plt.plot(
    *zip(*itertools.chain.from_iterable(itertools.combinations(all_data, 2))),
    color = 'brown', marker = 'o')

plt.show()

【讨论】:

  • 有没有你可以列出每条线相交的点数?
  • 嗯,这是一个有趣的问题,完全独立于绘图。请将它作为一个新问题发布,以便比我更聪明的人加入。
  • 暴力解决方案是编写一个函数,如果给定 3 个共线点,则返回 True,否则返回 False。然后在for pair in itertools.combinations(...) 循环中,您只需测试set(all_data)-set(pair) 中的每个点与pair 中的点的共线性...
  • 你用*zip拯救了我的一天。
【解决方案3】:

另一种方法是使用 matplotlib 补丁

import matplotlib
import pylab as pl
fig, ax = pl.subplots()
import matplotlib.patches as patches
from matplotlib.path import Path

verts = [(x1,y1), (x2,y2)]
codes = [Path.MOVETO,Path.LINETO]
path = Path(verts, codes)
ax.add_patch(patches.PathPatch(path, color='green', lw=0.5))

【讨论】:

    【解决方案4】:

    使用所有组合?

    import matplotlib.pyplot as plot
    from matplotlib import pyplot
    
    all_data = [[1,10],[2,10],[3,10],[4,10],[5,10],[3,1],[3,2],[3,3],[3,4],[3,5]]
    x = []
    y = []
    for i in combinations(all_data,2):
        x.extend(i[0])
        y.extend(i[1])
    
    plot.plot(x,y)
    pyplot.show()
    

    【讨论】:

    • 组合不起作用,它说 george@P632144:~/Desktop$ python line_cluster_3.py Traceback(最近一次调用最后):文件“line_cluster_3.py”,第 8 行,在 for i in combination(all_data,2): NameError: name 'combinations' is not defined
    • @George 抱歉,您应该导入它:从 itertools 导入组合查看 unutbu 答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多