在ggplot x轴刻度标签中自定义角度

时间:2018-11-13 18:05:02

标签: r ggplot2 axis-labels

我想使用heatmap绘制ggplot2,并且希望自定义x轴刻度线-位置,文本和角度。

这是我的示例数据:

set.seed(1)
df <- reshape2::melt(matrix(rnorm(100*20),100,20,dimnames = list(paste0("G",1:100),paste0("S",1:20))))

我想让x轴刻度线只有一个刻度值,位于轴范围的中间-10,标签为“ X-Label”,呈90度角。另外,我不需要x轴标题。

这就是我要尝试的:

library(ggplot2)
ggplot(data=df,mapping=aes(x=Var2,y=Var1,fill=value))+
  geom_tile()+theme_minimal()+scale_fill_gradient2(name="Scaled Value",low="darkblue",mid="gray",high="darkred")+
  scale_x_discrete(breaks=10,labels="X-Label")+theme(axis.title.x=element_blank(),axis.text.x=element_text(angle=90,hjust=1,vjust=0.5))

enter image description here

因此,显然它不起作用。

我认为我可以将角度定义为scale_x_discrete参数的一部分,但找不到该选项。

此外,请注意,我不需要x轴标题,而只需要勾选文本。因此,我不确定为什么breaks中的labelsscale_x_discrete参数会被忽略。

使用plotly获得以下结果:

library(plotly)
library(dplyr)
plot_ly(z=c(df$value),x=df$Var2,y=df$Var1,colors=grDevices::colorRamp(c("darkblue","gray","darkred")),type="heatmap",colorbar=list(title="Scaled Value",len=0.4)) %>%
  layout(yaxis=list(title=NULL),xaxis=list(tickangle=90,tickvals=10,ticktext="X-Label"))

enter image description here

谢谢

2 个答案:

答案 0 :(得分:2)

我认为指定breaks = 10会导致您的轴标签无法打印。 10不是您的值之一,它不适合?scale_x_discrete中有效参数的描述,因此让我们使用真实的x轴值。您说“在中间”,所以我将使用"G50",因为您的x轴值范围是"G1""G100"

ggplot(data = df,
       mapping = aes(x = Var1, y = Var2, fill = value)) +
  geom_tile() +
  theme_minimal() +
  scale_fill_gradient2(
    name = "Scaled Value",
    low = "darkblue",
    mid = "gray",
    high = "darkred"
  ) +
  scale_x_discrete(breaks = "G50", labels = "X-Label", name = "") + 
  theme(
    axis.text.x = element_text(
      angle = 90,
      hjust = 1,
      vjust = 0.5
  ))

enter image description here

我还在name = ""函数中指定了scale,而不是使用theme来禁用轴标题。

如果您需要动态计算中间水平,这有点混乱,但这应该可以工作:

breaks = levels(df$Var1)[ceiling(length(levels(df$Var1)) / 2)]

答案 1 :(得分:0)

scale_x_discrete中的breaks选项未指定中断次数,而是以下一项:

  • 没有中断的空
  • waiver()表示由转换对象计算的默认中断
  • 休息的字符向量
  • 以极限为输入并返回中断作为输出的函数

我发现最简单的是定义字符向量。在这种情况下,第50个元素的一半以上。

set.seed(1)
df <- reshape2::melt(matrix(rnorm(100*20),100,20,dimnames = list(paste0("G",1:100),paste0("S",1:20))))

library(ggplot2)
ggplot(data=df,mapping=aes(x=Var1,y=Var2,fill=value))+
  geom_tile() +
  theme_minimal() +
  scale_fill_gradient2(name="Scaled Value",low="darkblue",mid="gray",high="darkred") +
  scale_x_discrete(breaks=unique(df$Var1)[50],labels="X-Label") +
  theme(axis.title.x=element_blank(), axis.text.x=element_text(angle=90,hjust=1,vjust=0.5))

#Use this line instead to label along the axis
 #scale_x_discrete(breaks=unique(df$Var1)[seq(1,100, 10)],labels=unique(df$Var1)[seq(1,100, 10)]) +

enter image description here

希望这是您想要的。