R 宽度可变的重叠条形图/直方图

R 宽度可变的重叠条形图/直方图,r,ggplot2,R,Ggplot2,我有 我想做一个条形图,其中y是cols FST>0.4 exFST>0.4 inFST>0.4的值,x是chr col,条形的宽度是chrtolen 我正试着用电脑做这件事 chr totgenes FST>0.4 %FST>0.4 exFST>0.4 %exFST>0.4 inFST>0.4 %inFST>0.4 chrtotlen 1 1457 49 3.36307 73 5.0103

我有

我想做一个条形图,其中y是cols FST>0.4 exFST>0.4 inFST>0.4的值,x是chr col,条形的宽度是chrtolen

我正试着用电脑做这件事

chr  totgenes  FST>0.4  %FST>0.4  exFST>0.4  %exFST>0.4  inFST>0.4  %inFST>0.4  chrtotlen
1    1457      49       3.36307   73         5.0103      54         3.70625     114375790
1A   1153      49       4.24978   72         6.24458     48         4.1630      70879221
2    1765      80       4.53258   132        7.47875     96         5.43909     151896526
3    1495      33       2.20736   56         3.74582     35         2.34114     111449612
4    953       58       6.08604   89         9.33893     56         5.87618     71343966
4A   408       9        2.20588   17         4.16667     11         2.69608     19376786
5    1171      52       4.44065   81         6.91716     44         3.75747     61898265
6    626       48       7.66773   62         9.90415     47         7.50799     34836644
7    636       8        1.25786   24         3.77358     8          1.25786     38159610
8    636       24       3.77358   28         4.40252     27         4.24528     30964699
9    523       18       3.44168   23         4.39771     21         4.0153      25566760
最终版本:

data<-read.table("realBFWBM_noNAs.fst.totgenesChrcp", sep="\t", header = TRUE)
myVector <- c("chr", "FST.0.4", "exFST.0.4", "inFST.0.4", "chrtotlen")
counts = data[,myVector]
par(xpd = TRUE, mar = c(4,4,2,2))
invisible(sapply(2:4, function(x)
  barplot(counts[, x], as.vector(counts$chrtotlen), axes = FALSE, axisnames = FALSE,
          #border = 0.5,
          density = x + 5,
          angle = x ^ 5,
          space=0,
          axis.lty = 1, ylim = c(0, 150), 
          add  = ifelse(x == 2, FALSE, TRUE))))

axis(2, at = seq(0, 100, 150), labels = seq(0, 100 , 150))
axis(1, at = barplot(counts), labels = colnames(counts))
库(tidyverse)
#您的数据、colnames因非良好做法而更改colnames不应以数字或%
#chr=a,`FST>0.4`=c,`exFST>0.4`=e,`inFST>0.4`=g,chrtolene=i)
#a、c、e、g、i相关

数据这不是一件容易的事,但一个相当直接的解决方法是使用
geom\u rect
手动构建绘图

我无耻地改编了下面两条线索中的观点,这个问题几乎与之重复

轴问题是通过将离散轴伪装成连续轴来解决的。然后将伪离散标签指定给连续打断

库(tidyverse)
df%
变异(rel_len=chrtolen/max(chrtolen))
#来自链接线程1的想法

w在
geom_栏中
尝试
position=“dodge”
。我没有看到直方图代码,只有一个条形图,没有重叠的图。是的,这是我过去用不同的数据做的另外两个图。我只是上传了一些例子来说明我想在这里描绘的东西。我也不知道我是否应该在这里做几何图形或几何图形柱状图。看起来你既想要
geom图形
又想要
geom图形
。尝试一下,但将透明度
alpha=0.2
或其他值设置为小于或等于0.5。我不确定,但您的宽度相当大?!是的,它可以是成比例的(chrtotlen/1000000)。不需要是绝对数。但我不认为这是造成问题的原因。这与我需要的更为相似!我不知道为什么酒吧之间的空间和重叠。你在为x轴做什么?谢谢,问题是宽度。我不明白为什么有必要。查看我的编辑图片,没有宽度参数。是的,我需要与chrtotlen成比例的条。这就是最具挑战性的部分。我添加了我用来制作三维柱状图的代码,因为我没有使用ggplot。这似乎更正确!除了酒吧之间的空间。你介意分享它的代码吗?谢谢,很好!表现完全如预期的那样。谢谢!:)
data<-read.table("realBFWBM_noNAs.fst.totgenesChrcp", sep="\t", header = TRUE)
myVector <- c("chr", "FST.0.4", "exFST.0.4", "inFST.0.4", "chrtotlen")
counts = data[,myVector]
par(xpd = TRUE, mar = c(4,4,2,2))
invisible(sapply(2:4, function(x)
  barplot(counts[, x], as.vector(counts$chrtotlen), axes = FALSE, axisnames = FALSE,
          #border = 0.5,
          density = x + 5,
          angle = x ^ 5,
          space=0,
          axis.lty = 1, ylim = c(0, 150), 
          add  = ifelse(x == 2, FALSE, TRUE))))

axis(2, at = seq(0, 100, 150), labels = seq(0, 100 , 150))
axis(1, at = barplot(counts), labels = colnames(counts))
library(tidyverse)

# your data, colnames changed due to not good practice colnames should not start with number or %
# chr=a, `FST>0.4`=c,  `exFST>0.4`= e, `inFST>0.4`=g,  chrtotlene=i)
# a, c, e, g, i relevant
data <- tribble(
~a, ~b, ~c, ~d, ~e, ~f, ~g, ~h, ~i,
"1", "1457", "49", "336.307", "73", "50.103", "54", "370.625", "114375790", 
"1A", "1153", "49", "424.978", "72", "624.458", "48", "41.630", "70879221", 
"2", "1765", "80", "453.258", "132", "747.875", "96", "543.909", "151896526", 
"3", "1495", "33", "220.736", "56", "374.582", "35", "234.114", "111449612", 
"4", "953", "58", "608.604", "89", "933.893", "56", "587.618", "71343966", 
"4A", "408", "9", "220.588", "17", "416.667", "11", "269.608", "19376786", 
"5", "1171", "52", "444.065", "81", "691.716", "44", "375.747", "61898265", 
"6", "626", "48", "766.773", "62", "990.415", "47", "750.799", "34836644", 
"7", "636", "8", "125.786", "24", "377.358", "8", "125.786", "38159610", 
"8", "636", "24", "377.358", "28", "440.252", "27", "424.528", "30964699", 
"9", "523", "18", "344.168", "23", "439.771", "21", "40.153", "25566760")


# change type of columns and divide chrtotlene by 1.6e+08
data$a <- as.factor(data$a)
data$i <- as.numeric(data$i)
data$i <- data$i/1.6e+08
data$c <- as.numeric(data$c)
data$e <- as.numeric(data$e)
data$g <- as.numeric(data$g)


# data to long format (for ggplot2) with tidyverse package
data1 <- data %>% 
  select(a, c, e, g, i) %>% 
  pivot_longer(
    cols = 2:4,
    names_to = "Label",
    values_to = "Value"
  ) %>% 
  mutate(Label=recode(Label,
                    "c" = "FST>0.4",
                    "e" = "exFST>0.4", 
                    "g" = "inFST>0.4"))

# ggplot
ggplot(data1, aes(x=a, y=Value, width=i))+ 
geom_bar(aes(fill=Label), stat = "identity") + 
  theme(
panel.grid.major.x = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank(),
legend.title = element_blank(),
legend.position = c(0.8, 0.8),
axis.title.x=element_text(size=20),
text = element_text(size=20),
axis.text.x = element_text(size=20),
panel.background = element_blank(),
axis.text.y = element_text(size=20)
)