如何使用geom_bar优化图形ggplot

时间:2018-05-19 08:34:51

标签: r ggplot2 geom-bar

我是R下的初学者,我创建了一个图表,将温度叠加到沉淀物上,在ggplot下以geom_bar作为选项。但是,我使用选项position = position_nudge (x = 0.4),因此图形不是彼此重叠。当我使用此选项时,它完全改变了计算方式。

例如,正如您将在下面看到的那样,我想在正确日期的条形图上找到一个条形图,直到31/30。你知道如何解决这个问题吗?提前感谢您的宝贵帮助。

下面是我的表格和我的代码。

SOUNAME year_month  pre_type    pre_value   tem_type    tem_value   nb_species
WATERFORD (TYCOR)   2014-04 NONE    14  V_COLD  0   NA
WATERFORD (TYCOR)   2014-04 HEAVY   3   COLD    30  8
WATERFORD (TYCOR)   2014-04 LIGHT   7   HOT 0   NA
WATERFORD (TYCOR)   2014-04 MEDIUM  6   MEDIUM  0   NA
WATERFORD (TYCOR)   2014-05 NONE    15  V_COLD  0   NA
WATERFORD (TYCOR)   2014-05 HEAVY   3   COLD    31  17
WATERFORD (TYCOR)   2014-05 LIGHT   10  HOT 0   NA
WATERFORD (TYCOR)   2014-05 MEDIUM  3   MEDIUM  0   NA
WATERFORD (TYCOR)   2014-06 NONE    17  V_COLD  0   NA
WATERFORD (TYCOR)   2014-06 HEAVY   2   COLD    17  NA
WATERFORD (TYCOR)   2014-06 LIGHT   9   HOT 13  NA
WATERFORD (TYCOR)   2014-06 MEDIUM  2   MEDIUM  0   NA

ggplot(data = complet_w, 
       aes(x = complet_w$year_month, 
           y = complet_w$pre_value, 
           fill = complet_w$pre_type, 
           width=0.5), 
       stat = "identity") + 
  geom_bar(stat = "identity") + 
  xlab("date") + 
  ylab ("Number of days of precipitation") + 
  ggtitle("Precipitation per month") + 
  labs(fill = "Frequency") +
  geom_bar(data=complet_w,
           aes(x=complet_w$year_month, 
               y=complet_w$tem_value, 
               fill=complet_w$tem_type, 
               width=0.1), 
           stat = "identity", 
           position = position_nudge(x=0.4)) + 
  xlab("date") + 
  ylab("Number of days of temperature") + 
  ggtitle("Temperature per month") + 
  labs(fill = "Frequency") 

以下是我的结果。我希望所有的酒吧都是30-31。有可能吗?

result

3 个答案:

答案 0 :(得分:0)

您可以将position_nudge()替换为position_stack()。但要在一个图中得到2个图,你必须分别改变geom_bar()的美学。

使用这样的代码:

#Change xval.yval and xlab to your requirement

ggplot(Dataname)+geom_bar(stat="identity",aes(x=as.numeric(xval)-0.25,y=yval))+
geom_bar(stat="identity",aes(x=as.numeric(xval)+0.25,y=yval))+
scale_x_discrete(labels= xlabs)   #because you have renamed them using aes()

希望这有帮助!

答案 1 :(得分:0)

我记得你以前的问题。我想你正在寻找这样的东西:

library(dplyr)
library(ggplot2)
library(reshape2)      #To use melt
View(TEMP_PREC_BIRR)
View(TEMP_BIRR)
write.csv(TEMP_PREC_BIRR,"Data1.csv")
write.csv(TEMP_BIRR,"Data2.csv")
Data1=melt(TEMP_PREC_BIRR,id.vars="year_month")
Data2=melt(TEMP_BIRR,id.vars="year_month")
Data=rbind(Data1,Data2)
Data=Data[!(Data$variable=="SOUNAME"),]
View(Data)
Data=read.csv("Data1.csv")
View(Data)
ggplot(Data,aes(x=year_month,y=Data$precipitation_value_,fill=Data$precipitation_type))+
  geom_col()

ggplot(data = TEMP_PREC_BIRR, aes(x = TEMP_PREC_BIRR$year_month, 
                                  y = TEMP_PREC_BIRR$precipitation_value, 
                                  fill = TEMP_PREC_BIRR$precipitation_type,width=0.2)) + 
  geom_bar(aes(x = as.numeric(year_month)+0.25, 
               y = TEMP_PREC_BIRR$precipitation_value, 
               fill = TEMP_PREC_BIRR$precipitation_type),
           stat = "identity",position = position_stack()) + 
  xlab("date") + ylab ("Number of days of precipitation") + 
  ggtitle("Precipitation per month - BIRR") + labs(fill = "Frequency")+
  geom_bar(data=TEMP_BIRR,aes(x=as.numeric(TEMP_BIRR$year_month)-0.25,
                                 y=TEMP_BIRR$temperature_value,
                                 fill=TEMP_BIRR$temperature_type), stat = "identity",position = position_stack()) +
  xlab("date") + ylab("Number of days of temperature") + 
  ggtitle("Temperature per month - BIRR") + labs(fill = "Frequency")+
  theme(panel.background=element_blank())

Output Plot

答案 2 :(得分:0)

有一些事情不太适合ggplot的设置:

  1. 您已多次设置标签和标题。如果您有一个情节,然后说ggtitle("Title 1") + ggtitle("Title 2"),则只显示标题2,因为最后一次调用会覆盖之前的任何调用。与您对xlab等的调用相同。
  2. 您有多个geom_bar个实例,但它们的功能基本相同。这通常表示您的数据应该是长格式,因此您可以将某些变量映射到您当前不是的美学。我恭敬地不同意以前的答案,这些答案会保留对geom_bar的多次调用,并鼓励您根据ggplot范例重塑数据。
  3. 在极少数情况下,除了ggplot之外,您应该在使用data =时回头查看数据框的名称。它可能会导致奇怪的错误。因此x = TEMP_PREC_BIRR$year_month应为x = year_month
  4. 让您的数据变成长格式让我意识到了几件事:您目前正在将某些温度的天数与某些降水量的天数进行比较。例如,fill正在接受重度降水和冷却温度,但这些并不具有可比性。你也有“中等”作为潜在的温度和降水水平,这意味着它们只会在fill中被集中在一起。您需要相应地调整这些type标签。

    有两种类型的测量 - 降水和温度 - 你想要一起显示但不能直接比较是一个很好的分面用例,我在第一个例子中做了。

    我通过gather两次将数据转换为长形状,一次生成一列度量类型(pre或tem),一次得到一列值。由于跨度量类型重复类型的级别问题,我使用interaction使类似“MEDIUM.pre”的类型与“MEDIUM.tem”区分开来。这仍然不太理想,因为你以相同的比例提供填充颜色,但采用不同类型的措施。

    然后我调用facet_wrap(~ measure)来显示两种度量类型相关但不相同。如果您在较大的数据集中有多个位置,则可以facet_grid(SOUNAME ~ measure)

    library(tidyverse)
    
    df <- structure(list(
      SOUNAME = c("WATERFORD (TYCOR)", "WATERFORD (TYCOR)","WATERFORD (TYCOR)", "WATERFORD (TYCOR)", "WATERFORD (TYCOR)","WATERFORD (TYCOR)", "WATERFORD (TYCOR)", "WATERFORD (TYCOR)","WATERFORD (TYCOR)", "WATERFORD (TYCOR)", "WATERFORD (TYCOR)","WATERFORD (TYCOR)"), 
      year_month = c("2014-04", "2014-04", "2014-04","2014-04", "2014-05", "2014-05", "2014-05", "2014-05", "2014-06","2014-06", "2014-06", "2014-06"), 
      pre_type = c("NONE", "HEAVY","LIGHT", "MEDIUM", "NONE", "HEAVY", "LIGHT", "MEDIUM", "NONE","HEAVY", "LIGHT", "MEDIUM"), 
      pre_value = c(14L, 3L, 7L, 6L, 15L,3L, 10L, 3L, 17L, 2L, 9L, 2L), 
      tem_type = c("V_COLD", "COLD","HOT", "MEDIUM", "V_COLD", "COLD", "HOT", "MEDIUM", "V_COLD","COLD", "HOT", "MEDIUM"), 
      tem_value = c(0L, 30L, 0L, 0L, 0L,31L, 0L, 0L, 0L, 17L, 13L, 0L), 
      nb_species = c(NA, 8L, NA, NA,NA, 17L, NA, NA, NA, NA, NA, NA)), 
      .Names = c("SOUNAME", "year_month","pre_type", "pre_value", "tem_type", "tem_value", "nb_species"), 
      class = c("tbl_df", "tbl", "data.frame"), 
      row.names = c(NA,-12L))
    
    df %>%
      select(-nb_species) %>%
      gather(key = measure, value = type, pre_type, tem_type) %>%
      gather(key = pre_or_tem2, value = value, pre_value, tem_value) %>%
      select(-pre_or_tem2) %>%
      mutate(measure = str_extract(measure, "^[a-z]+")) %>%
      mutate(type = interaction(type, measure)) %>%
      ggplot(aes(x = year_month, y = value, fill = type)) +
        geom_col(position = "stack") +
        scale_fill_brewer(palette = "Set2") +
        facet_wrap(~ measure)
    

    在第二个例子中,我做了一些编辑。我注意到温度和降水的组合数量有限,所以我建立了一个两者之间相互作用的列;通过此分组加上year_month,您可以总结降水量和温度相结合的天数。我将此交互列映射到填充,并删除了分面。同样,如果您在多个位置进行观察,则可以使用facet_wrap(~ SOUNAME)

    df %>%
      select(-nb_species) %>%
      gather(key = measure, value = value, pre_value, tem_value) %>%
      mutate(measure = str_extract(measure, "^[a-z]+")) %>%
      mutate(pre_type = paste0(pre_type, "pre")) %>%
      mutate(tem_type = paste0(tem_type, "tem")) %>%
      select(-measure) %>%
      mutate(type = interaction(pre_type, tem_type)) %>%
      group_by(SOUNAME, year_month, type) %>%
      summarise(value = sum(value)) %>%
      ungroup() %>%
      ggplot(aes(x = year_month, y = value, fill = type)) +
        geom_col() +
        scale_fill_brewer(palette = "Set2")
    

    reprex package(v0.2.0)创建于2018-05-19。

    最后说明:我删除了nb_species列只是为了简化我正在使用的数据,因为它没有出现在图中;我使用geom_col(),相当于geom_bar(stat = "identity");我使用了Color Brewer调色板,因为它更容易区分大量的颜色。随意忽略所有这些步骤。