【问题标题】:Different font faces and sizes within label text entries in ggplot2ggplot2中标签文本条目中的不同字体和大小
【发布时间】:2011-07-11 16:16:47
【问题描述】:

我正在构建在轴文本中有两行的图表。第一行包含组名,第二行包含该组人口。我将轴标签构建为单个字符串,格式为“LINE1 \n LINE2”。是否可以为 LINE1 和 LINE2 分配不同的字体和大小,即使它们包含在单个字符串中?我希望 LINE1 大且加粗,LINE2 小且不加粗。

下面是一些示例代码:

Treatment <- rep(c('T','C'),each=2)
Gender <- rep(c('Male','Female'),2)
Response <- sample(1:100,4)
test_df <- data.frame(Treatment, Gender, Response)

xbreaks <- levels(test_df$Gender)
xlabels <- paste(xbreaks,'\n',c('POP1','POP2'))

hist <- ggplot(test_df, aes(x=Gender, y=Response, fill=Treatment, stat="identity"))
hist + geom_bar(position = "dodge") + scale_y_continuous(limits = c(0, 
    100), name = "") + scale_x_discrete(labels=xlabels, breaks = xbreaks) + 
    opts(
      axis.text.x = theme_text(face='bold',size=12)
      )

我试过了,但结果是一个大的粗体条目和一个小的非粗体条目:

hist + geom_bar(position = "dodge") + scale_y_continuous(limits = c(0, 
     100), name = "") + scale_x_discrete(labels=xlabels, breaks = xbreaks) + 
     opts(
      axis.text.x = theme_text(face=c('bold','plain'),size=c('15','10'))
     )

另一种可能的解决方案是创建单独的图表元素,但我认为 ggplot2 没有可用的“子轴标签”元素...

任何帮助将不胜感激。

干杯, 亚伦

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    我也认为仅使用 ggplot2 功能无法制作图表。

    我会使用grid.textgrid.gedit

    require(ggplot2)
    Treatment <- rep(c('T','C'), each=2)
    Gender <- rep(c('Male','Female'), 2)
    Response <- sample(1:100, 4)
    test_df <- data.frame(Treatment, Gender, Response)
    
    xbreaks <- levels(test_df$Gender)
    xlabels <- paste(xbreaks,'\n',c('',''))
    
    hist <- ggplot(test_df, aes(x=Gender, y=Response, fill=Treatment,
      stat="identity"))
    hist + geom_bar(position = "dodge") + 
      scale_y_continuous(limits = c(0, 100), name = "") +
      scale_x_discrete(labels=xlabels, breaks = xbreaks) + 
      opts(axis.text.x = theme_text(face='bold', size=12))
    grid.text(label="POP1", x = 0.29, y = 0.06)
    grid.text(label="POP2", x = 0.645, y = 0.06)
    grid.gedit("GRID.text", gp=gpar(fontsize=8))
    

    请尝试根据您的环境调整代码(例如子轴标签的位置和字体大小)。

    【讨论】:

    • 我发现这个问题在ggplot2 - google group被多发。
    • 仍在研究这个......我喜欢这个解决方案,但我遇到的问题是组类别的数量会根据我正在查看的数据集而有所不同(我的团体不只是男性和女性——这只是一个例子)。你的作弊很酷,但我不知道我是否可以让它足够灵活。不过,感谢您的贡献!
    • 最后这是我能做到的最好的了——请看下面的答案。干杯,A
    【解决方案2】:

    我在下面找到了另一个简单的解决方案:

    require(ggplot2)
    Treatment <- rep(c('T','C'),each=2)
    Gender <- rep(c('Male','Female'),2)
    Response <- sample(1:100,4)
    test_df <- data.frame(Treatment, Gender, Response)
    
    xbreaks <- levels(test_df$Gender)
    xlabels[1] <- expression(atop(bold(Female), scriptstyle("POP1")))
    xlabels[2] <- expression(atop(bold(Male), scriptstyle("POP2")))
    
    hist <- ggplot(test_df, aes(x=Gender, y=Response, fill=Treatment,
    stat="identity"))
    hist +
      geom_bar(position = "dodge") +
      scale_y_continuous(limits = c(0, 100), name = "") +
      scale_x_discrete(label = xlabels, breaks = xbreaks) +
      opts(
        axis.text.x = theme_text(size = 12)
      )
    

    【讨论】:

    • 这更好,但我仍然面临处理多个类别的挑战......谢谢,伙计 - 我希望很快能发布一个解决方案。
    【解决方案3】:

    全部,

    使用三合会的作弊,这是我能找到的最接近的解决方案。如果您有任何问题,请告诉我:

    library(ggplot2)
    
    spacing <- 0 #We can adjust how much blank space we have beneath the chart here
    
    labels1= paste('Group',c('A','B','C','D'))
    labels2 = rep(paste(rep('\n',spacing),collapse=''),length(labels1))
    labels <- paste(labels1,labels2)
    
    qplot(1:4,1:4, geom="blank") +
     scale_x_continuous(breaks=1:length(labels), labels=labels) + xlab("")+
     opts(plot.margin = unit(c(1, 1, 3, 0.5), "lines"),
          axis.text.x = theme_text(face='bold', size=14))
    
    xseq <- seq(0.15,0.9,length.out=length(labels)) #Assume for now that 0.15 and 0.9 are      constant plot boundaries
    
    sample_df <-  data.frame(group=rep(labels1,each=2),subgroup=rep(c('a','b'),4),pop=sample(1:10,8))
        popLabs <- by(sample_df,sample_df$group,function(subData){
        paste(paste(subData$subgroup,' [n = ', subData$pop,']',sep=''),collapse='\n')
    })
    
    gridText <- paste("grid.text(label='\n",popLabs,"',x=",xseq,',y=0.1)',sep='')
    
    sapply(gridText, function(x){ #Evaluate parsed character string for each element of gridText
      eval(parse(text=x))
    })
    
    grid.gedit("GRID.text", gp=gpar(fontsize=12))
    

    干杯, 亚伦

    【讨论】:

      猜你喜欢
      • 2020-03-27
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多