簡體   English   中英

使用線連接所有點,並使用R在其上方書寫文本

[英]Connect all points using lines and write text above it using R

我試圖使用線段將數組中的每個點與該數組中的所有其他點連接起來,並在此行的上方稍稍寫一些文本 因此,我要實現下一個目標:

在此處輸入圖片說明

我已經嘗試過使用segments()lines()函數,但是我不知道我該怎么做。

就像我說的那樣,現在我只有要編寫的坐標數組和字符串數組。 我該如何實現(如果我只需要使用標准R庫,那會很好)?

UPD:

dataset.csv:

,A,B,C
A,0,1,2
B,1,0,3
C,2,3,0

script.r:

myDataset <- read.csv("dataset.csv")
row.names(myDataset) <- myDataset[, 1]
myDataset <- myDataset[, -1]
d <- dist(myDataset)
fit <- cmdscale(d,eig=TRUE, k=2)
x <- fit$points[,1]
y <- fit$points[,2]

這是一個使用combn生成兩個點的組合,然后在它們之間繪制lines並計算距離並將其寫入中間的示例。

#DATA
set.seed(42)
df = data.frame(x = rnorm(4),  y = rnorm(4))

#DRAW POINTS    
plot(df)

#DRAW LINES
combn(1:NROW(df), 2, function(x)
    lines(df[x,]), simplify = FALSE)

#WRITE TEXT
combn(1:NROW(df), 2, function(x)
    text(x = mean(df[x,1]),  #calculate center point x-value in the line
        y = mean(df[x,2]),  #calculate center point y-value in the line
        labels = round(dist(df[x,]), 2), #calculate distance to write
        srt = 180 * atan(diff(df[x, 2])/diff(df[x,1]))/pi, #calculate rotation angle of text
        pos = 3, #place text slightly above given x and y
        font = 2), #bold text
    simplify = FALSE)

在此處輸入圖片說明

UPDATE

myDataset <- read.csv(strip.white = TRUE, stringsAsFactors = FALSE, header = TRUE, text = ",A,B,C
A,0,1,2
                      B,1,0,3
                      C,2,3,0")
row.names(myDataset) <- myDataset[, 1]
myDataset <- myDataset[, -1]
d <- dist(myDataset)
fit <- cmdscale(d,eig=TRUE, k=2)
x <- fit$points[,1]
y <- fit$points[,2]

df = data.frame(x, y)

#DRAW POINTS
plot(df, asp = 1)
text(x = df[,1], y = df[,2], labels = rownames(df), pos = 1)

#Create a list of combination of indices
temp = combn(1:NROW(df), 2, simplify = FALSE)

#DRAW LINES
sapply(temp, function(i) lines(df[i,]))

#WRITE TEXT
sapply(temp, function(x)
    text(x = mean(df[x,1]),  #calculate center point x-value in the line
        y = mean(df[x,2]),  #calculate center point y-value in the line
        labels = myDataset[cbind(which(row.names(myDataset) == row.names(df)[x[1]]),
                    which(colnames(myDataset) == row.names(df)[x[2]]))],
        srt = 180 * atan(diff(df[x, 2])/diff(df[x,1]))/pi, #calculate rotation angle of text
        pos = 3, #place text slightly above given x and y
        font = 2), #bold text
    simplify = FALSE)

嘗試使用圖形基元(例如lines )來實現這一點注定很痛苦。

請改用專用庫進行圖形繪制,例如ggraph “邊緣”小插圖有一個帶有邊緣標簽的示例:

ggraph(simple, layout = 'graphopt') + 
    geom_edge_link(aes(label = type), 
                   angle_calc = 'along',
                   label_dodge = unit(2.5, 'mm'),
                   arrow = arrow(length = unit(4, 'mm')), 
                   end_cap = circle(3, 'mm')) + 
    geom_node_point(size = 5)

在此處輸入圖片說明

缺點之一:ggraph不允許您顯式設置節點位置; 但是,您可以手動操作它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM