根据数据框列订购 Y 轴 ggplot 箱线图
Order Y-axis ggplot boxplot based on dataframe column
我用 ggplot 制作了一个箱线图,但我想根据我使用汇总统计创建的不同数据框中的列顺序更改 y 轴的顺序。
这是脚本。脚本下方是我想要的输出的描述。
#data
df <- data.frame(City = c("NY", "AMS", "BER", "PAR", "NY", "AMS", "AMS", "PAE"),
Time_Diff = c(4, 2, 7, 9, 2, 1, 10, 9),
Outliers = c(0, 0, 0, 0, 0, 1, 1, 0))
#data summary
summary <- df %>%
group_by(City) %>%
summarise(Median = median(Time_Diff),
IQR = IQR(Time_Diff),
Outliers = sum(Outliers)) %>%
arrange(desc(Median), desc(IQR), desc(Outliers))
summary <- as.data.frame(summary)
# Create ggplot object
bp <-ggplot(data = df, aes(x = reorder(City, Time_Diff, FUN = median), y= Time_Diff)) # Creates boxplots
# Create boxplot figure
bp +
geom_boxplot(outlier.shape = NA) + #exclude outliers to increase visibility of graph
coord_flip(ylim = c(0, 25)) +
geom_hline(yintercept = 4) +
ggtitle("Time Difference") +
ylab("Time Difference") +
xlab("City") +
theme_light() +
theme(panel.grid.minor = element_blank(),
panel.border = element_blank(), #remove all border lines
axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"), #add x-axis border line
axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black")) #add y-axis border line
我希望 y 轴(翻转的 x 轴)的顺序与摘要数据框中城市列的顺序相同。这意味着:
从上到下:PAE、PAR、BER、NY、AMS
有什么高效优雅的建议吗?
解决方案
谢谢 Prradep,我将您的解决方案用于脚本并且它有效。我稍微调整了一下,这样我就不必再次输入轴的值了。我重新使用了数据框中的城市向量。这是我使用的脚本:
#data
df <- data.frame(City = c("NY", "AMS", "BER", "PAR", "NY", "AMS", "AMS", "PAE"),
Time_Diff = c(4, 2, 7, 9, 2, 1, 10, 9),
Outliers = c(0, 0, 0, 0, 0, 1, 1, 0))
#data summary
summary <- df %>%
group_by(City) %>%
summarise(Median = median(Time_Diff),
IQR = IQR(Time_Diff),
Outliers = sum(Outliers)) %>%
arrange(desc(Median), desc(IQR), desc(Outliers))
summary <- as.data.frame(summary)
# Preproces data for figure
order_city <- summary$City
# Create ggplot object
bp <-ggplot(data = df, aes(x = reorder(City, Time_Diff, FUN = median), y= Time_Diff)) # Creates boxplots
# Create boxplot figure
bp +
geom_boxplot(outlier.shape = NA) + #exclude outliers to increase visibility of graph
coord_flip(ylim = c(0, 25)) +
geom_hline(yintercept = 4) +
ggtitle("Time Difference") +
ylab("Time Difference") +
xlab("City") +
theme_light() +
theme(panel.grid.minor = element_blank(),
panel.border = element_blank(), #remove all border lines
axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"), #add x-axis border line
axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black")) + #add y-axis
scale_x_discrete(limits = rev(order_city)) #this is the function to change the order of the axis
添加 scale_x_discrete(limits = rev(c('PAE', 'PAR', 'BER', 'NY', 'AMS')))
即可。
这是您要找的吗:
# Create ggplot object
bp <-ggplot(data = df, aes(x = reorder(City, Time_Diff, FUN = median), y= Time_Diff)) # Creates boxplots
# Create boxplot figure
bp +
geom_boxplot(outlier.shape = NA) + #exclude outliers to increase visibility of graph
coord_flip(ylim = c(0, 25)) +
geom_hline(yintercept = 4) +
ggtitle("Time Difference") +
ylab("Time Difference") +
xlab("City") +
theme_light() +
theme(panel.grid.minor = element_blank(),
panel.border = element_blank(), #remove all border lines
axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"), #add x-axis border line
axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black")) + #add y-axis border line
scale_x_discrete(limits = rev(c('PAE', 'PAR', 'BER', 'NY', 'AMS')))
我用 ggplot 制作了一个箱线图,但我想根据我使用汇总统计创建的不同数据框中的列顺序更改 y 轴的顺序。
这是脚本。脚本下方是我想要的输出的描述。
#data
df <- data.frame(City = c("NY", "AMS", "BER", "PAR", "NY", "AMS", "AMS", "PAE"),
Time_Diff = c(4, 2, 7, 9, 2, 1, 10, 9),
Outliers = c(0, 0, 0, 0, 0, 1, 1, 0))
#data summary
summary <- df %>%
group_by(City) %>%
summarise(Median = median(Time_Diff),
IQR = IQR(Time_Diff),
Outliers = sum(Outliers)) %>%
arrange(desc(Median), desc(IQR), desc(Outliers))
summary <- as.data.frame(summary)
# Create ggplot object
bp <-ggplot(data = df, aes(x = reorder(City, Time_Diff, FUN = median), y= Time_Diff)) # Creates boxplots
# Create boxplot figure
bp +
geom_boxplot(outlier.shape = NA) + #exclude outliers to increase visibility of graph
coord_flip(ylim = c(0, 25)) +
geom_hline(yintercept = 4) +
ggtitle("Time Difference") +
ylab("Time Difference") +
xlab("City") +
theme_light() +
theme(panel.grid.minor = element_blank(),
panel.border = element_blank(), #remove all border lines
axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"), #add x-axis border line
axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black")) #add y-axis border line
我希望 y 轴(翻转的 x 轴)的顺序与摘要数据框中城市列的顺序相同。这意味着:
从上到下:PAE、PAR、BER、NY、AMS
有什么高效优雅的建议吗?
解决方案
谢谢 Prradep,我将您的解决方案用于脚本并且它有效。我稍微调整了一下,这样我就不必再次输入轴的值了。我重新使用了数据框中的城市向量。这是我使用的脚本:
#data
df <- data.frame(City = c("NY", "AMS", "BER", "PAR", "NY", "AMS", "AMS", "PAE"),
Time_Diff = c(4, 2, 7, 9, 2, 1, 10, 9),
Outliers = c(0, 0, 0, 0, 0, 1, 1, 0))
#data summary
summary <- df %>%
group_by(City) %>%
summarise(Median = median(Time_Diff),
IQR = IQR(Time_Diff),
Outliers = sum(Outliers)) %>%
arrange(desc(Median), desc(IQR), desc(Outliers))
summary <- as.data.frame(summary)
# Preproces data for figure
order_city <- summary$City
# Create ggplot object
bp <-ggplot(data = df, aes(x = reorder(City, Time_Diff, FUN = median), y= Time_Diff)) # Creates boxplots
# Create boxplot figure
bp +
geom_boxplot(outlier.shape = NA) + #exclude outliers to increase visibility of graph
coord_flip(ylim = c(0, 25)) +
geom_hline(yintercept = 4) +
ggtitle("Time Difference") +
ylab("Time Difference") +
xlab("City") +
theme_light() +
theme(panel.grid.minor = element_blank(),
panel.border = element_blank(), #remove all border lines
axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"), #add x-axis border line
axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black")) + #add y-axis
scale_x_discrete(limits = rev(order_city)) #this is the function to change the order of the axis
添加 scale_x_discrete(limits = rev(c('PAE', 'PAR', 'BER', 'NY', 'AMS')))
即可。
这是您要找的吗:
# Create ggplot object
bp <-ggplot(data = df, aes(x = reorder(City, Time_Diff, FUN = median), y= Time_Diff)) # Creates boxplots
# Create boxplot figure
bp +
geom_boxplot(outlier.shape = NA) + #exclude outliers to increase visibility of graph
coord_flip(ylim = c(0, 25)) +
geom_hline(yintercept = 4) +
ggtitle("Time Difference") +
ylab("Time Difference") +
xlab("City") +
theme_light() +
theme(panel.grid.minor = element_blank(),
panel.border = element_blank(), #remove all border lines
axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"), #add x-axis border line
axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black")) + #add y-axis border line
scale_x_discrete(limits = rev(c('PAE', 'PAR', 'BER', 'NY', 'AMS')))