【发布时间】:2020-10-13 21:35:52
【问题描述】:
Name Value1 Value2 Value3
1 A1 -0.05970872 -1.1651404 1.3516952
2 A2 0.44143488 -0.7270722 -1.9870423
3 A3 0.34616897 -0.3891095 0.9123736
4 A4 0.49289331 1.3957877 -0.2689896
5 A5 -1.39354557 0.9429327 1.0719274
我有上面的数据框,我想在 ggplot2 中为它生成四个图表,每个图表的 x 轴作为“名称”列,y 轴作为其他列的值。虽然 x 轴不需要有“刻度线”,但如果 y 轴低于截止值,例如 0,我确实想有条件地用它们对应的“名称”列值的名称标记点。下面是我的代码使用 R 中的基本绘图函数通过循环函数自动生成图形。我附上了一张示例图。
cutoff = 0
df = read.csv("Book4.csv", header = TRUE)
list = rownames(df)
for(i in names(df)){
png(filename = paste(i,".png"))
plot(df[,i],
main = i,
ylab = "Values",
xlab = "Names",
col = ifelse(df[,i]<cutoff, 'red', 'gray'),
pch = ifelse(df[,i] < cutoff, 10, 1)
)
abline(cutoff, 0, col= "blue", lty=2)
outlier = which(df[,i]<=cutoff)
if (length(outlier)>0){
text(outlier, df[outlier,i], list[outlier], cex=0.7, pos=2)
}
dev.off()
}
问题是这些图形标签通常是隐藏的,或者当我使用较大的数据集时会重叠,因此我无法读取它们。因此,我想使用 ggplot2 和函数 geom_text_repel 来重现它。我曾尝试使用 for 循环来执行此操作,但在使用 geom_text_repel 进行点标记时遇到了困难,因为我不确定如何有条件地使用它进行标记。我将制作超过 200 个 png,所以如果它可以自动化并以“Value1.png”、“Value2.png”等文件名输出,我将不胜感激。
这是我在下面的 ggplot 中的尝试
cutoff = 0
df = read.csv("Book4.csv", header = TRUE, row.names = 1)
for(i in colnames(df)){
png(filename = paste(i,".png"))
outlier = which(df[,i]<=cutoff)
print(ggplot(df, aes(x = rownames(df), y = df[,i])) +
geom_point() +
geom_text_repel(data = df, label=outlier))
dev.off()
}
我不断收到错误消息“错误:美学必须是长度 1 或与数据 (5): 标签相同”,我不确定如何解决这个问题。
【问题讨论】: