通过ggplot在密度图中添加部分数据
Adding a part of data in a density plot by ggplot
我有一个文件有两个不同的类别,其中大部分属于一个类别。类别是:in
和 out
。
file1_ggplot.txt
status scores
in 44
in 55
out 12
out 23
out 99
out 13
为了绘制密度分布图,我正在使用此代码,但我想添加类别摘要和具有 in
:
的行
library(data.table)
library(ggplot2)
library(plyr)
filenames <- list.files("./scores",pattern="*ggplot.txt", full.names=TRUE)
pdf("plot.pdf")
for(file in filenames){
library(tools)
bases <- file_path_sans_ext(file)
data1 <- fread(file)
cdat <- ddply(data1, "status", summarise, scores.mean=mean(scores))
data1ggplot <- ggplot(data1, aes(x=scores, colour=status)) + geom_density() + geom_vline(data=cdat, aes(xintercept=scores.mean, colour=status), linetype="dashed", size=1)
print(data1ggplot + ggtitle(basename(bases)))
}
dev.off()
哪个输出:
我想添加一个框,其中包含 in
行:
in 44
in 55
而且,
> summary(data1$scores)
Min. 1st Qu. Median Mean 3rd Qu. Max.
12.00 15.50 33.50 41.00 52.25 99.00
为此,我尝试使用 tableGrob
:
data1ggplot <- ggplot(data1, aes(x=scores, colour=status)) + geom_density() + geom_vline(data=cdat, aes(xintercept=scores.mean, colour=status), linetype="dashed", size=1) + annotation_custom(tableGrob(summary(data1$scores))
但它给出了相同的图,上面只有 summary
的数字。
然后,我用in.
grep了这些行
cat file1_ggplot.txt | grep -w "in" > only-in.txt
然后在 R
:
data2<-fread("only-in.txt")
trs <- as.data.frame(t(data2))
trs
V1 V2
V1 in in
V2 44 55
data1ggplot <- ggplot(data1, aes(x=scores, colour=status)) + geom_density() + geom_vline(data=cdat, aes(xintercept=scores.mean, colour=status), linetype="dashed", size=1) + annotation_custom(tableGrob(trs))
它输出:
如果不先在 bash
中使用 grep
,我该怎么做才能在绘图旁边正确查看这些表格,以及带有 in
的行?
这是一个解决方案,假设你想要的 table 格式:
个人剧情
library(tidyverse)
library(gridExtra) # tableGrob
library(broom) # glance
df_summary <- t(broom::glance(summary(data1$scores)))
data1 %>%
ggplot(., aes(x = scores, colour = status)) +
geom_density() +
geom_vline(data = . %>%
group_by(status) %>%
summarise(scores.mean = mean(scores)),
aes(xintercept = scores.mean, colour = status),
linetype = "dashed",
size = 1) +
annotation_custom(tableGrob(rbind(data.frame(data1 %>% filter(status == "in") %>% rename(var = status, val = scores)),
data.frame(var = row.names(df_summary), val = df_summary, row.names = NULL)),
rows = NULL, cols = NULL),
xmin = 60, xmax = 100,
ymin = 0.1, ymax = 0.4)
应用于数据帧列表
# Mock data
set.seed(1)
data_list = list(data1,
data.frame(status = data1$status, scores = c(40, 60, 15, 21, 97, 10)),
data.frame(status = data1$status, scores = c(45, 56, 11, 25, 95, 14)))
# Create a function
your_function <- function(df) {
df_summary <- t(broom::glance(summary(df$scores)))
df %>%
ggplot(., aes(x = scores, colour = status)) +
geom_density() +
geom_vline(data = . %>%
group_by(status) %>%
summarise(scores.mean = mean(scores)),
aes(xintercept = scores.mean, colour = status),
linetype = "dashed",
size = 1) +
annotation_custom(tableGrob(rbind(data.frame(df %>% filter(status == "in") %>% rename(var = status, val = scores)),
data.frame(var = row.names(df_summary), val = df_summary, row.names = NULL)), rows = NULL, cols = NULL),
xmin = 60, xmax = 100,
ymin = 0.1, ymax = 0.4)
}
# Check if it works
your_function(data_list[[2]])
your_function(data_list[[3]])
# Map it
pdf("plot.pdf")
map(data_list, your_function)
dev.off()
您现在应该有一个 "plot.pdf" 文件,每个图有 3 页。
注意tableGrob
的位置要根据你的日期来调整,我不知道table放在哪里,你也可以根据汇总值计算位置。
我有一个文件有两个不同的类别,其中大部分属于一个类别。类别是:in
和 out
。
file1_ggplot.txt
status scores
in 44
in 55
out 12
out 23
out 99
out 13
为了绘制密度分布图,我正在使用此代码,但我想添加类别摘要和具有 in
:
library(data.table)
library(ggplot2)
library(plyr)
filenames <- list.files("./scores",pattern="*ggplot.txt", full.names=TRUE)
pdf("plot.pdf")
for(file in filenames){
library(tools)
bases <- file_path_sans_ext(file)
data1 <- fread(file)
cdat <- ddply(data1, "status", summarise, scores.mean=mean(scores))
data1ggplot <- ggplot(data1, aes(x=scores, colour=status)) + geom_density() + geom_vline(data=cdat, aes(xintercept=scores.mean, colour=status), linetype="dashed", size=1)
print(data1ggplot + ggtitle(basename(bases)))
}
dev.off()
哪个输出:
我想添加一个框,其中包含 in
行:
in 44
in 55
而且,
> summary(data1$scores)
Min. 1st Qu. Median Mean 3rd Qu. Max.
12.00 15.50 33.50 41.00 52.25 99.00
为此,我尝试使用 tableGrob
:
data1ggplot <- ggplot(data1, aes(x=scores, colour=status)) + geom_density() + geom_vline(data=cdat, aes(xintercept=scores.mean, colour=status), linetype="dashed", size=1) + annotation_custom(tableGrob(summary(data1$scores))
但它给出了相同的图,上面只有 summary
的数字。
然后,我用in.
cat file1_ggplot.txt | grep -w "in" > only-in.txt
然后在 R
:
data2<-fread("only-in.txt")
trs <- as.data.frame(t(data2))
trs
V1 V2
V1 in in
V2 44 55
data1ggplot <- ggplot(data1, aes(x=scores, colour=status)) + geom_density() + geom_vline(data=cdat, aes(xintercept=scores.mean, colour=status), linetype="dashed", size=1) + annotation_custom(tableGrob(trs))
它输出:
如果不先在 bash
中使用 grep
,我该怎么做才能在绘图旁边正确查看这些表格,以及带有 in
的行?
这是一个解决方案,假设你想要的 table 格式:
个人剧情
library(tidyverse)
library(gridExtra) # tableGrob
library(broom) # glance
df_summary <- t(broom::glance(summary(data1$scores)))
data1 %>%
ggplot(., aes(x = scores, colour = status)) +
geom_density() +
geom_vline(data = . %>%
group_by(status) %>%
summarise(scores.mean = mean(scores)),
aes(xintercept = scores.mean, colour = status),
linetype = "dashed",
size = 1) +
annotation_custom(tableGrob(rbind(data.frame(data1 %>% filter(status == "in") %>% rename(var = status, val = scores)),
data.frame(var = row.names(df_summary), val = df_summary, row.names = NULL)),
rows = NULL, cols = NULL),
xmin = 60, xmax = 100,
ymin = 0.1, ymax = 0.4)
应用于数据帧列表
# Mock data
set.seed(1)
data_list = list(data1,
data.frame(status = data1$status, scores = c(40, 60, 15, 21, 97, 10)),
data.frame(status = data1$status, scores = c(45, 56, 11, 25, 95, 14)))
# Create a function
your_function <- function(df) {
df_summary <- t(broom::glance(summary(df$scores)))
df %>%
ggplot(., aes(x = scores, colour = status)) +
geom_density() +
geom_vline(data = . %>%
group_by(status) %>%
summarise(scores.mean = mean(scores)),
aes(xintercept = scores.mean, colour = status),
linetype = "dashed",
size = 1) +
annotation_custom(tableGrob(rbind(data.frame(df %>% filter(status == "in") %>% rename(var = status, val = scores)),
data.frame(var = row.names(df_summary), val = df_summary, row.names = NULL)), rows = NULL, cols = NULL),
xmin = 60, xmax = 100,
ymin = 0.1, ymax = 0.4)
}
# Check if it works
your_function(data_list[[2]])
your_function(data_list[[3]])
# Map it
pdf("plot.pdf")
map(data_list, your_function)
dev.off()
您现在应该有一个 "plot.pdf" 文件,每个图有 3 页。
注意tableGrob
的位置要根据你的日期来调整,我不知道table放在哪里,你也可以根据汇总值计算位置。