绘制嵌套向量

时间:2014-03-24 19:08:56

标签: clojure plot incanter

考虑一个输出嵌套向量的函数,例如

[[[-0.6925523827697917 -0.4095089425269985]
  [-0.03856010899727634 0.8427233420960013]
  [-2.609986195686694E-13 -1.680032093051418E-12]]
 [[0.7203362514229046 -0.3494564274369062]]]

在单个括号中,即[-0.6925523827697917 -0.4095089425269985],是用笛卡尔坐标绘制的数字。

另外,在另一个括号内有向量,即

[[0.7203362514229046 -0.3494564274369062]]

表示群集。

我正在寻找绘制上面向量的点,并绘制一条连接簇内点的线。因此,群集[[-0.6925523827697917 -0.4095089425269985] [-0.03856010899727634 0.8427233420960013] [-2.609986195686694E-13 -1.680032093051418E-12]]中的点将被连接。

我的第一个想法是使用Incanter的xy-plot。我不确定的部分是如何从诸如矢量的索引结构转到图上的点。此外,我不知道如何绘制连接聚集点的线。上面的示例应该在第一个集群中的三个点上有一条线(最好是平滑的),而在集群中只有一个点,因此没有穿过最后一个集群的线。

1 个答案:

答案 0 :(得分:1)

我不确定你想要什么,但据我所知,它是这样的:

(use '(incanter core charts interpolation))

(defn my-plot [[data [[cx cy]]]]
  (let [x       (map first data)
        y       (map second data)
        lbound  (apply min x)
        rbound  (apply max x)
        interp  (interpolate data :cubic-hermite)]
    (-> (function-plot interp lbound rbound)
        (add-points x y)
        (add-points [cx] [cy])
        view)))

cubic spline interpolation

我正在使用:cubic-hermite样条线interpolation来使线条平滑,我正在使用add-points function将数据点添加到plot

你会找到more interpolation examples here

但是对于良好插值而言,三点是不够的,所以你应该考虑使用线性插值:

(defn my-plot [[data [[cx cy]]]]
  (let [x (map first data)
        y (map second data)]
    (-> (xy-plot x y)
        (add-points x y)
        (add-points [cx] [cy])
        view)))

linear interpolation

更新

让我们仔细看看我在这里做了什么。

首先,我正在使用解构来提取数据点和集群坐标(我假设您的数据点后面总是有一个集群):

(defn my-plot [[data [[cx cy]]]]

然后我将[x y]对的嵌套向量分成两个向量(每个维度一个):

  (let [x (map first data)
        y (map second data)]

然后我创建一个绘图对象并使用您的数据点在其上绘制一条线:

    (-> (xy-plot x y)

然后我正在添加原始数据点(蓝点):

        (add-points x y)

和您的群集(绿点):

        (add-points [cx] [cy])

最后,我正在显示结果图:

        view)))

在我的第一个例子中,我也使用插值使线条更平滑:

        lbound  (apply min x)
        rbound  (apply max x)
        interp  (interpolate data :cubic-hermite)]
    (-> (function-plot interp lbound rbound)

我在这里使用function-plot,因为interp对象是一个函数。