[英]How to add custom labels from a dataset on top of bars using ggplot/geom_bar in R?
我有附加的數據集並使用此R代碼繪制數據:
plotData <- read.csv("plotdata.csv")
ix <- 1:nrow(plotData)
long <- melt(transform(plotData, id = ix), id = "id") # add id col; melt to long form
ggp2 <- ggplot(long, aes(id, value, fill = variable))+geom_bar(stat = "identity", position = "dodge")+
scale_x_continuous(breaks = ix) +
labs(y='Throughput (Mbps)',x='Nodes') +
scale_fill_discrete(name="Legend",
labels=c("Inside Firewall (Dest)",
"Inside Firewall (Source)",
"Outside Firewall (Dest)",
"Outside Firewall (Source)")) +
theme(legend.position="right") + # The position of the legend
theme(legend.title = element_text(colour="blue", size=14, face="bold")) + # Title appearance
theme(legend.text = element_text(colour="blue", size = 12, face = "bold")) # Label appearance
plot(ggp2)
結果圖也附上。
現在我需要在每個條形圖的頂部添加來自不同數據集的數字。 例如:
我曾嘗試使用geom_text()
但我不知道如何從不同的數據集中讀取數字。 請注意,數據集具有不同的行數(這會給我帶來額外的問題)。 任何建議都非常感謝。
附件在這里 。
抱歉,我不得不壓縮所有文件,因為我不允許在帖子中添加超過2個網址。
我認為最好的解決方案是將所有數據集合並為一個:
# loading the different datasets
plotData <- read.csv("plotData.csv")
IFdest <- read.table("sampleNumIFdest.csv", sep="\t", header=TRUE, strip.white=TRUE)
IFsource <- read.table("sampleNumIFsource.csv", sep="\t", header=TRUE, strip.white=TRUE)
OFdest <- read.table("sampleNumOFdest.csv", sep="\t", header=TRUE, strip.white=TRUE)
OFsource <- read.table("sampleNumOFsource.csv", sep="\t", header=TRUE, strip.white=TRUE)
# add an id
ix <- 1:nrow(plotData)
plotData$id <- 1:nrow(plotData)
plotData <- plotData[,c(5,1,2,3,4)]
# combine the different dataframe
plotData$IFdest <- c(IFdest$Freq, NA)
plotData$IFsource <- c(IFsource$Freq, NA, NA)
plotData$OFdest <- OFdest$Freq
plotData$OFsource <- c(OFsource$Freq, NA, NA)
# reshape the dataframe
long <- cbind(
melt(plotData, id = c("id"), measure = c(2:5),
variable = "type", value.name = "value"),
melt(plotData, id = c("id"), measure = c(6:9),
variable = "name", value.name = "numbers")
)
long <- long[,-c(4,5)] # this removes two unneceassary columns
完成后,您可以使用geom_text
繪制條形頂部的數字:
# create your plot
ggplot(long, aes(x = id, y = value, fill = type)) +
geom_bar(stat = "identity", position = "dodge") +
geom_text(aes(label = numbers), vjust=-1, position = position_dodge(0.9), size = 3) +
scale_x_continuous(breaks = ix) +
labs(x = "Nodes", y = "Throughput (Mbps)") +
scale_fill_discrete(name="Legend",
labels=c("Inside Firewall (Dest)",
"Inside Firewall (Source)",
"Outside Firewall (Dest)",
"Outside Firewall (Source)")) +
theme_bw() +
theme(legend.position="right") +
theme(legend.title = element_text(colour="blue", size=14, face="bold")) +
theme(legend.text = element_text(colour="blue", size=12, face="bold"))
結果:
如您所見,文本標簽有時會重疊。 您可以通過減小文本的大小來改變它,但隨后又冒着標簽變得難以閱讀的風險。 因此,您可以考慮通過將facet_grid(type ~ .)
(或facet_wrap(~ type)
)添加到繪圖代碼來使用facet:
ggplot(long, aes(x = id, y = value, fill = type)) +
geom_bar(stat = "identity", position = "dodge") +
geom_text(aes(label = numbers), vjust=-0.5, position = position_dodge(0.9), size = 3) +
scale_x_continuous("Nodes", breaks = ix) +
scale_y_continuous("Throughput (Mbps)", limits = c(0,1000)) +
scale_fill_discrete(name="Legend",
labels=c("Inside Firewall (Dest)",
"Inside Firewall (Source)",
"Outside Firewall (Dest)",
"Outside Firewall (Source)")) +
theme_bw() +
theme(legend.position="right") +
theme(legend.title = element_text(colour="blue", size=14, face="bold")) +
theme(legend.text = element_text(colour="blue", size=12, face="bold")) +
facet_grid(type ~ .)
這導致以下情節:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.