考虑一个输出嵌套向量的函数,例如
[[[-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。我不确定的部分是如何从诸如矢量的索引结构转到图上的点。此外,我不知道如何绘制连接聚集点的线。上面的示例应该在第一个集群中的三个点上有一条线(最好是平滑的),而在集群中只有一个点,因此没有穿过最后一个集群的线。
答案 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-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)))
让我们仔细看看我在这里做了什么。
首先,我正在使用解构来提取数据点和集群坐标(我假设您的数据点后面总是有一个集群):
(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
对象是一个函数。