简体   繁体   English

如何在ggplot2中的数据点上方和下方绘制列

[英]How to plot columns above and below data points in ggplot2

Using ggplot2, I am plotting percentage values for 15 species across three sites (each species occurs in each site). 使用ggplot2,我绘制了三个地点的15种物种的百分比值(每个物种都出现在每个地点)。 The data points associated with site 'C' are my reference points. 与站点“C”相关的数据点是我的参考点。

Now, instead of plotting sites 'A' and 'B' as points, I would like to display them using vertical lines or column-like structures. 现在,我不想将网站“A”和“B”绘制为点,而是希望使用垂直线或列状结构来显示它们。 As such, these data points should be extended as vertical lines to the top or bottom side of the site 'C' points (green colour), ie to the top where values are larger than the reference value and bottom for smaller values. 因此,这些数据点应该作为垂直线延伸到站点“C”点(绿色)的顶部或底部,即顶部,其中值大于参考值,底部是较小值。

Specifically, I would hope for a red line from a red point to the green point and a blue line from the blue point to the green point. 具体来说,我希望从红点到绿点的红线和从蓝点到绿点的蓝线。 The red line should ideally have the same width as the red point (and same for blue). 理想情况下,红线的宽度应与红点的宽度相同(蓝色相同)。 The line should also be offset as are the red and blue points (relative to the green point), so that lines do not overlap. 该线也应该像红色和蓝色点(相对于绿点)一样被偏移,因此线不重叠。 Finally, the line should not go to the center but the edge of a point. 最后,线不应该到达中心而是一个点的边缘。

For this purpose I have offset points for 'A' and 'B' and also reduced their size to half of the reference point size. 为此,我有'A'和'B'的偏移点,并且还将它们的大小减小到参考点大小的一半。

library(ggplot2) 
MyData$species <- as.character(MyData$species)
MyData$species <- factor(MyData$species, levels=unique(MyData$species))

pos <- position_dodge(width=0.21)
cols <- c("C" = "darkgreen", "B" = "blue", "A" = "red")

tiff(file = "MyData.tiff", height=10, width=10, units="in", res=300, compression="lzw")
ggplot(data = MyData, aes(x=species, y=value, group=site, colour=site)) +
  geom_point(data=subset(MyData, site=="C"), size = 4, shape=15, alpha=1, position=pos) + 

  geom_line(data=subset(MyData, site=="C"), size = 2, lwd=2, alpha=0.4, show_guide=FALSE) +

  geom_point(data=subset(MyData, site!="C"), size = 1.8, shape=15, alpha=1, position = pos) + 
  scale_colour_manual(values = cols) +
  xlab("Species") +
  ylab("Value (%)") + 
  scale_y_continuous(expand=c(0.01,0.01),
                     limits=c(0.0,100),   
                     breaks=c(0,20,40,60,80,100),
                     labels=c("0","20","40","60","80","100")) + 
  theme_bw() +
  theme(legend.position="none") +
  theme(axis.title.x = element_text(vjust=0.1,face="bold", size=16),
        axis.text.x = element_text(vjust=0.4, size=14, angle=90, hjust=1.0)) +
  theme(axis.title.y = element_text(vjust=0.1,face="bold", size=16),
        axis.text.y = element_text(face="bold", size=14, angle=0)) +
  theme(panel.grid.minor=element_blank(), panel.grid.major=element_blank()) +
  theme(panel.border = element_rect(size=1, color = "black")) +
  theme(plot.margin = unit(c(0.3,0.4,0.3,0.3),"lines"))
dev.off()

This is my current plot. 这是我目前的情节。 So basically, I would like to replace the red and blue points with lines that extend to the green points (without overlapping them). 基本上,我想用延伸到绿点的线代替红色和蓝色点(不重叠它们)。

在此输入图像描述

Many thanks in advance for any advice on an elegant solution for this. 非常感谢您提供有关优雅解决方案的任何建议。

This is a dput() of my dataset. 这是我的数据集的dput()。

structure(list(site = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L), .Label = c("A", "B", "C"), class = "factor"), 
    species = structure(c(13L, 11L, 2L, 14L, 1L, 9L, 12L, 10L, 
    6L, 8L, 15L, 7L, 3L, 4L, 5L, 13L, 11L, 2L, 14L, 1L, 9L, 12L, 
    10L, 6L, 8L, 15L, 7L, 3L, 4L, 5L, 13L, 11L, 2L, 14L, 1L, 
    9L, 12L, 10L, 6L, 8L, 15L, 7L, 3L, 4L, 5L), .Label = c("Species 1", 
    "Species 10", "Species 11", "Species 12", "Species 13", "Species 14", 
    "Species 15", "Species 2", "Species 3", "Species 4", "Species 5", 
    "Species 6", "Species 7", "Species 8", "Species 9"), class = "factor"), 
    value = c(2, 3.25, 3.53, 4.31, 4.59, 5.26, 6.02, 6.42, 6.6, 
    7.26, 8.89, 12.45, 35.62, 72.42, 73.55, 1.36, 2.36, 2.17, 
    10.34, 6.84, 1.88, 5.09, 7.35, 3.87, 10.55, 6.6, 14.64, 39.57, 
    88.06, 64.54, 5.03, 12.34, 5.42, 3.63, 5.16, 6.04, 3, 8.94, 
    3.28, 7.64, 6.25, 21.96, 39.35, 78.55, 47.35)), .Names = c("site", 
"species", "value"), class = "data.frame", row.names = c(NA, 
-45L))

You can try geom_linerange() for the lines from points A/B to point C. 您可以尝试geom_linerange()来获取从A / B点到C点的线。

Define the ymin/ymax values for each site/species, & reorder site such that A / B lines drop down to each side of point C: 定义每个站点/物种的ymin / ymax值,并重新排序站点,使A / B线下降到点C的每一侧:

library(dplyr) 库(dplyr)

MyData <- MyData %>%
  group_by(species) %>%
  mutate(value.C = value[site == "C"]) %>%
  rowwise() %>%
  mutate(value.min = min(value, value.C),
         value.max = max(value, value.C)) %>%
  ungroup() %>%
  mutate(site = factor(site, levels = c("A", "C", "B")))

Plot: 情节:

# vary dodge width such that the lines drop to the edge of point C
# for your chosen dimensions (for mine 0.5 was about right)
pos <- position_dodge(width = 0.5) 

ggplot(data = MyData,
       aes(x = species, y = value, 
           ymin = value.min, ymax = value.max, 
           group = site, colour = site, size = site)) +

  geom_linerange(size = 1.8, alpha = 0.4, position = pos) +

  geom_line(data = subset(MyData, site == "C"),
            size = 2, lwd = 2, alpha = 0.4) +
  geom_point(data = subset(MyData, site == "C"),
             size = 4, shape = 15, position = pos) +
  scale_color_manual(values = cols) +
  theme_classic() +
  theme(legend.position = "none")
  # + other theme-related settings...

情节

You can add geom_line to draw the vertical lines 您可以添加geom_line来绘制垂直线

library(ggplot2) 
MyData$species <- as.character(MyData$species)
MyData$species <- factor(MyData$species, levels=unique(MyData$species))

pos <- position_dodge(width=0.21)
cols <- c("C" = "darkgreen", "B" = "blue", "A" = "red")

windows()
ggplot(data = MyData, aes(x=species, y=value, group=site, colour=site)) +
  geom_point(data=subset(MyData, site=="C"), size = 4, shape=15, alpha=1, position=pos) + 
  geom_line(data=subset(MyData, site=="C"), size = 2, lwd=2, alpha=0.4, show_guide=FALSE) +
  geom_point(data=subset(MyData, site!="C"), size = 1.8, shape=15, alpha=1, position = pos) + 
  geom_line(aes(group = species)) + #New code Added
  scale_colour_manual(values = cols) +
  xlab("Species") +
  ylab("Value (%)") + 
  scale_y_continuous(expand=c(0.01,0.01),
                     limits=c(0.0,100),   
                     breaks=c(0,20,40,60,80,100),
                     labels=c("0","20","40","60","80","100")) + 
  theme_bw() +
  theme(legend.position="none") +
  theme(axis.title.x = element_text(vjust=0.1,face="bold", size=16),
        axis.text.x = element_text(vjust=0.4, size=14, angle=90, hjust=1.0)) +
  theme(axis.title.y = element_text(vjust=0.1,face="bold", size=16),
        axis.text.y = element_text(face="bold", size=14, angle=0)) +
  theme(panel.grid.minor=element_blank(), panel.grid.major=element_blank()) +
  theme(panel.border = element_rect(size=1, color = "black")) +
  theme(plot.margin = unit(c(0.3,0.4,0.3,0.3),"lines"))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM