【问题标题】:Label every nth element in ggplot depending on row/column根据行/列标记ggplot中的每个第n个元素
【发布时间】:2019-07-11 17:06:55
【问题描述】:

我正在用ggplot (t9) 绘制我的 PCA 数据 (= pca.df) 并尝试标记我的数据点。超过 500 个数据点彼此相邻,如果我标记每个数据点,标记会变得混乱,因此我只想每 10 或 15 个数据点标记一次。

我尝试使用gghighlight,但我对ifelse 语句的基本了解导致我无法解决。

我的(t9) 代码打印在下面。结果应该是一个分数/分数图,轴上的值是 PC1PC2,假设是根据行号标记的第 5 个元素。

> dput(head(df))
structure(c(0.720861821444252, 0.741748310125995, 0.708402634437037, 
0.709801133484984, 0.715066449559326, 0.736082130721757, 0.653704393279032, 
0.698276222706427, 0.72211406630421, 0.715258352183308, 0.687541455566144, 
0.70691880577236, 0.648677410108962, 0.652162185222687, 0.673335514807695, 
0.686310528373139, 0.672288782506351, 0.685387769196099, 0.606520717118424, 
0.591747992573417, 0.637540141146717, 0.643172972625407, 0.631438730296424, 
0.684507675451748, 0.555771668718988, 0.593784695895615, 0.587382247577035, 
0.576747109369824, 0.609475457932671, 0.59866246596185, 0.519063669593429, 
0.530651696453032, 0.532787309576192, 0.541282412745153, 0.548262870872043, 
0.538801663579734, 0.4839370855738, 0.483476075398052, 0.495569187972609, 
0.508351252780073, 0.516728822566894, 0.536204665645588, 0.444866548123319, 
0.451359569708855, 0.488498854129039, 0.458566775758124, 0.466211854024398, 
0.491560347455407, 0.391256576032243, 0.407839446833575, 0.415186340652814, 
0.424286965099726, 0.411873304932725, 0.429761415133547, 0.339836624254536, 
0.368786621339532, 0.355816757014086, 0.378789270638685, 0.39335185857301, 
0.391171949534279, 0.301518457021116, 0.323263419961053, 0.319326889442142, 
0.329577970161398, 0.332317131236052, 0.328401547614829, 0.278194980292123, 
0.271241021424707, 0.278009324614118, 0.289181065286873, 0.282708689390152, 
0.287325696956387, 0.217765754577593, 0.229671138051344, 0.214270216785571, 
0.248548146541018, 0.242536426938002, 0.247615674841088, 0.161232560624038, 
0.167964791643414, 0.184493790352952, 0.169637631152996, 0.207171184044563, 
0.18671607328531, 0.136854807157759, 0.110836224164859, 0.141700425964129, 
0.170466088007464, 0.147693931044626, 0.161727182052285, 0.0820803384886784, 
0.094874042231684, 0.0838404020068718, 0.106453346170999, 0.0893222925431942, 
0.105425228691039, 0.0320549073043817, 0.031817899518242, 0.0492796841876071, 
0.0534417407043242, 0.0492509775017762, 0.0576741314907473, -0.0003305571982993, 
0.00517263223466776, 0.00898939160288738, 0.0137528774437919, 
0.0152605422021288, 0.0215229583963186, -0.0532648337441121, 
-0.0283369016701845, -0.0236614679612245, -0.0250738126949397, 
-0.0339585310595162, -0.00502894085262935, -0.0837238471177474, 
-0.0406195676958014, -0.0552223579150677, -0.0469508535844212, 
-0.0427121136759291, -0.0552519953457953, -0.099633841516817, 
-0.0838034423810929, -0.0891078733208937, -0.0847178896069714, 
-0.0416689904316896, -0.0845884534908026, -0.112879391070739, 
-0.116357070717273, -0.105954173536172, -0.0809224012272034, 
-0.0803030066250538, -0.0804524938179006, -0.141076501626193, 
-0.141494024691483, -0.133849678959928, -0.118385990843758, -0.113423371384572, 
-0.123928162937715, -0.145978888454582, -0.145163933507897, -0.155263241214673, 
-0.139704305017438, -0.119946496925743, -0.143872145220887, -0.157460920557041, 
-0.172462482989155, -0.161340062935618, -0.160945553437212, -0.142106857091405, 
-0.146243108149656), .Dim = c(6L, 25L), .Dimnames = list(NULL, 
    c("1360", "1361", "1362", "1363", "1364", "1365", "1366", 
    "1367", "1368", "1369", "1370", "1371", "1372", "1373", "1374", 
    "1375", "1376", "1377", "1378", "1379", "1380", "1381", "1382", 
    "1383", "1384")))

pca.df = prcomp(na.omit(df), center = FALSE)

t9 = ggplot(get_pca_var(pca.df)$coord, aes(x = get_pca_var(pca.df)$coord[,1], y = get_pca_var(pca.df)$coord[,2])) +
  xlab("PC1") + ylab("PC2") + 
  geom_point() +
  geom_text(aes(label=seq(1:nrow(get_pca_var(pca.df)$coord)), hjust=0, vjust=5))

t9

这给出了以下图,但每个元素都被标记:

我想要这样的代码部分,但是使用ifelsefor 语句(每第n行/列,例如我下面的“尝试”中的第5个元素)来突出显示标签:

b = as.numeric(rownames(as.data.frame(iris.pca$x)))
ggplot(iris.pca) +
  geom_line(aes(x, y, colour = colour)) +
  gghighlight
 ""(for (b in PC1) { 
   if (x%%5 == 0) {
     print(label = as.numeric(rowname))
   } else (no label)
 }""

感谢您的帮助!

【问题讨论】:

  • 没有人有想法吗?
  • 运行dput时出现错误
  • 我编辑了我的数据。如果你能帮助我如何dput 整个数据,我将再次编辑我的问题!
  • 不知道这个,但它现在在我的书签里。希望我的 dputof 复制的 iris.pcadata 框架是有帮助的(见编辑)。

标签: r if-statement ggplot2


【解决方案1】:

我之前会添加几行。和你的想法差不多。

Every_Nth_label <- 5
Index <- 1
Label_full <- c(1:length(get_pca_var(pca.183s)$coord[,1]))
for(I in Label_full){
  if (Index %% Every_Nth_label != 0){
    Label_full[Index] <- ""
  }
  Index <- Index + 1
}
t9 = ggplot(get_pca_var(pca.183s)$coord, 
aes(
x = get_pca_var(pca.183s)$coord[,1], 
y = get_pca_var(pca.183s)$coord[,2])
) + 
xlab("PC1") + 
ylab("PC2") +
geom_point() +
geom_text(aes(label=Label_full, hjust=0, vjust=5))

如果这是您想要的,请告诉我们。

【讨论】:

  • 我终于通过dput 获得了我的df 的一部分,用于举例:D 现在它应该是完全可重现的。在图片中,您可以看到所有 25 个数据点都标有一个数字。我只希望每个第 5 个元素都有一个标签(其行名),如 5、10、15、20。我想通过与您已经编写的功能类似的功能来获得那些!再次感谢!
  • 我已经编辑了答案。现在你应该能够得到它。请告诉我。
  • 这正是我想要的。谢谢老哥!
猜你喜欢
  • 2021-09-13
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 2019-09-22
  • 2020-01-10
  • 2022-01-25
  • 1970-01-01
相关资源
最近更新 更多