R 双x轴直方图(图的顶部和底部)显示两个不同城市的温度分布

R 双x轴直方图(图的顶部和底部)显示两个不同城市的温度分布,r,ggplot2,histogram,gridextra,R,Ggplot2,Histogram,Gridextra,我试图创建一个有两个x轴的绘图。我想在这个图中画两个柱状图,一个在城市A的顶部(倒置),另一个在城市B的底部。我希望x轴以度表示温度 我尝试了几种不同的方法开始,但都失败了。我是非常有限的,主要是修改从互联网上复制的代码 city<-c(A, B, A, B, A, B) temp<-c(20, 25, 30, 35, 30, 40) data<-data.frame(city, temp) g.top <- ggplot(data, aes(x = temp)) +

我试图创建一个有两个x轴的绘图。我想在这个图中画两个柱状图,一个在城市A的顶部(倒置),另一个在城市B的底部。我希望x轴以度表示温度

我尝试了几种不同的方法开始,但都失败了。我是非常有限的,主要是修改从互联网上复制的代码

city<-c(A, B, A, B, A, B)
temp<-c(20, 25, 30, 35, 30, 40)
data<-data.frame(city, temp)

g.top <- ggplot(data, aes(x = temp)) +
  theme_bw() +
  theme(plot.margin = unit(c(1,5,-30,6),units="points"),
        axis.title.y = element_text(vjust =0.25)) +
  geom_histogram()
g.bottom <- ggplot(data, aes(x = temp)) +
  theme_bw() +
  theme(plot.margin = unit(c(0,5,1,1),units="points")) +
  geom_histogram()
grid.arrange(g.top,g.bottom, heights = c(1/5, 4/5))


p <- ggplot(data, aes(x = temp, y=city)) + geom_histogram(aes(y=variable))
但在任何情况下,它都不会给我第二个x轴

第二个代码给了我一个错误,说我不能使用带有y美学的statbin,这对我来说是有意义的,但我现在没有想法了


我真的很气馁,也非常非常感谢任何建议。这不一定是最简单的到达目的地的方法,但可以在途中提供控制。我将此视为数据重塑练习。首先,我得到每个城市的每个温度的计数,然后计算出这些计数之间有多少空间,然后绘制一个标准叠加的
geom\u col

# Get the counts
library(tidyverse)
my_data_transform <- data %>%
  count(temp, city, name = "count")

# Take that, and append after it rows that measure the "space between" each city's counts at each temperature.
my_data_transform2 <- bind_rows(
  my_data_transform,
  my_data_transform %>% 
    count(temp, wt = count, name = "count") %>%
    mutate(city = " ",
           count = 15 - count)  # Adjust to taste
  ) %>%
  # For plotting, I want the "space between" rows to be plotted in between the two cities.
  #  This is accomplished by making the city an ordered factor and putting the blanks 2nd.
  mutate(city = city %>% fct_relevel(" ", after = 1))

# Plot as geom_col, specifying clear bars for the middle ones.
ggplot(my_data_transform2, aes(temp, count, fill = city)) +
  geom_col() +
  scale_fill_manual(values = c("black", NA, "black")) +
  scale_y_continuous(labels = NULL, name = "") +
  theme_minimal()
#获取计数
图书馆(tidyverse)
我的数据转换%
计数(临时、城市、名称=“计数”)
#拿着它,在它后面附加行,这些行测量每个城市在每个温度下计数的“间隔”。
我的数据占2%
计数(温度,wt=count,name=“count”)%>%
变异(城市=”,
计数=15-计数)#根据口味调整
) %>%
#对于绘制,我希望在两个城市之间绘制“间距”行。
#这是通过使城市成为一个有序的因素,并把空白放在第二位来实现的。
变异(城市=城市%>%fct_relevel(“,之后=1))
#绘制为几何图形,指定中间的清晰条。
ggplot(我的数据转换2,aes(温度、计数、填充=城市))+
geom_col()+
刻度填充手册(数值=c(“黑色”,NA,“黑色”))+
连续缩放(标签=NULL,名称=”)+
主题_极小值()

分别绘制直方图,每个城市一个直方图:

  • 顶部,y轴翻转,x轴标签位于顶部
  • 像往常一样在一块地的底部
  • 为两个打印设置相同的x轴限制,以便在使用cowplot垂直对齐x轴时:plotgrid x轴将对齐
  • 见下例:

    library(ggplot2)
    library(cowplot)
    
    #bigger example data
    set.seed(1); data <- data.frame(city = sample(LETTERS[1:2], 100, replace = TRUE), 
                                    temp = sample(1:50, 100, replace = TRUE))
    
    g.top <- ggplot(data[ data$city == "A", ], aes(x = temp)) +
      geom_histogram() +
      scale_x_continuous(limits = c(10, 50), position = "top") +
      scale_y_reverse() +
      theme_minimal() 
    
    g.bottom <- ggplot(data[ data$city == "B", ], aes(x = temp)) +
      geom_histogram() +
      scale_x_continuous(limits = c(10, 50)) +
      theme_minimal()
    
    
    plot_grid(g.top, g.bottom, 
              labels = c("City A", "City B"), nrow = 2, align = 'hv')
    
    库(ggplot2)
    图书馆(cowplot)
    #更大的示例数据
    
    结实。种子(1);数据
    cowplot::绘图网格(g.top,g.bottom,nrow=2,rel\u heights=c(1,4),align='hv')
    ?我不知道你想为第二个做什么,因为你的数据中没有变量。也许你只是想
    ggplot(data,aes(temp))+geom_histogram()+facet_grid(city~,scales='free')
    ?为什么需要两个x轴,但要在彼此上方打印两个面板?另外,为什么要将顶部打印的边距设置为
    -30
    ?这往往会删除顶部绘图的x轴。当涉及到R时,我的能力严重不足。我试图在一个绘图上绘制两个直方图,但我能得到的最接近的结果是制作两个面板。我试着制作一个面板,两个x轴,一个y轴,一个柱状图悬挂在顶轴上,就像钟乳石一样,另一个柱状图悬挂在底部x轴上。我完全不知道该怎么做。我的老板要我做这件事,她还不如让我建造一艘火箭飞船。也许你可以在某处找到一个这样的例子——我不太清楚。我所想象的似乎不是一个显示数据的好方法,尽管这看起来很神奇!非常感谢你。唯一的问题是,当我尝试运行第二个代码块时(在获得计数后但在绘图之前),我得到了错误“Summary_impl(.data,dots)中的错误:求值错误:参数的“type”(closure)无效。”我想可能是因为temp应该是数字,所以我使用as.numeric作为temp,但现在我得到:UseMethod(“groups”)中的错误:没有适用于“groups”的方法应用于类“c”('double','numeric')的对象。非常感谢Jon Spring。我很接近,但我不知道为什么我不能让你的代码运行。你在使用什么数据,你的变量是什么数据类型?你能告诉我更多关于你的信息吗?这样我就可以复制你的问题了。嗨,乔恩·斯普林,你有没有办法给我发私人信息或电子邮件?我可以把我的csv文件发给你。我真的很想让你的代码正常工作,但一周后仍然无法解决。我的电子邮件是dickeyg51388@gmail.comThank非常感谢你;这太棒了!我要花上数百万年的时间去做你刚刚做过的事情。
    library(ggplot2)
    library(cowplot)
    
    #bigger example data
    set.seed(1); data <- data.frame(city = sample(LETTERS[1:2], 100, replace = TRUE), 
                                    temp = sample(1:50, 100, replace = TRUE))
    
    g.top <- ggplot(data[ data$city == "A", ], aes(x = temp)) +
      geom_histogram() +
      scale_x_continuous(limits = c(10, 50), position = "top") +
      scale_y_reverse() +
      theme_minimal() 
    
    g.bottom <- ggplot(data[ data$city == "B", ], aes(x = temp)) +
      geom_histogram() +
      scale_x_continuous(limits = c(10, 50)) +
      theme_minimal()
    
    
    plot_grid(g.top, g.bottom, 
              labels = c("City A", "City B"), nrow = 2, align = 'hv')