如何在美元之间加上ggplot2滴答标签?

时间:2013-12-02 11:15:08

标签: r graphics ggplot2 latex tikz

为了将ggplot2图形“转换”为带有tikzDevice包的pdf LaTeX图形,我想将轴标记标记放在两个$之间。当然,如果我手动指定刻度标签,我可以这样做,但是在使用自动刻度标签时怎么做? (特别是在x轴上使用日期时,很难手动指定标签)。

更新 - 使用轴标签格式化程序

的解决方案

根据@ agstudy的回答,我为数字标签编写了dollarify()格式化程序:

dollarify <- function(){
    function(x) paste0("$",x,"$")
}

和日期的datify()格式化程序:

datify <- function(){
  function(x){
    split <- stringr::str_split_fixed(as.character(x),"-",3)
    out <- character(nrow(split))
    for(i in 1:length(out)){
      out[i] <- paste0("\\formatdate{", split[i,3], "}{", split[i,2], "}{", split[i,1], "}")
    }
    out
  }
}

生成一个与datetime包一起使用的LaTeX代码:

\usepackage[ddmmyyyy]{datetime}

以下是渲染的屏幕截图,使用以下x轴缩放:

scale_x_date(breaks="2 months", labels=datify())

enter image description here

2 个答案:

答案 0 :(得分:3)

目前尚不清楚您想要做什么,但我认为您正在寻找轴标签格式化程序。

## forma  :you can give here any date format 
dollar_date_format <- function (forma = "%H:%M"){
    function(x) paste0("$",format(x,forma),"$")
}

然后使用一些数据(请在下次提供可重复的示例),您可以像这样使用它:

DF <- data.frame(time=Sys.time()+1:10,count=1:10)
library(ggplot2)
qplot(x=time,y=count,data=DF)+
    scale_x_datetime(labels = dollar_date_format(forma = "%M:%S"))+
    xlab("Time (dollars)") +
    theme(axis.text.x =element_text(size=20))

enter image description here

答案 1 :(得分:2)

如果您希望一般能够修改轴标签,则可以运行绘图,使用ggplot_build()将绘制的标签返回,然后添加例如scale_x_continuous() / scale_x_date()在呈现的中断上添加了自定义标签。您需要根据数据类型进行调整(查看build变量以查看可用的数据)。

您可能希望使用$x/y.labels$x/y.major_source,具体取决于数据类型

x=c("2013-03-22","2013-04-24","2013-07-01","2013-09-13")
y=c(1,2,3,4)
#any ggplot object
g<-qplot(as.Date(x),y)

#call the rendered axis labels
build<-ggplot_build(g)
xrng<-data.frame(build$panel$ranges[[1]]$x.major_source,stringsAsFactors=FALSE)
yrng<-data.frame(build$panel$ranges[[1]]$y.labels,stringsAsFactors=FALSE)
colnames(xrng)<-"value"
colnames(yrng)<-"value"

#create custom labels
xrng$lab<-paste0("$",row.names(xrng),"$")
yrng$lab<-paste0("$",yrng$value,"$")

#re-render with custom labels
g+scale_x_date(breaks=as.Date(xrng$value),labels=xrng$lab) +
  scale_y_continuous(breaks=as.numeric(yrng$value),labels=yrng$lab)

enter image description here