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

3

我想使用ggplot2绘制一个heatmap,并且我想自定义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轴标题,只需要刻度文本。因此,我不确定为什么在scale_x_discrete中的breakslabels参数被忽略了。

这是使用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"))

在此输入图片描述

感谢


你能否发布所需的结果,因为你的描述不是很清楚?这可能需要使用图像软件为我们勾勒出来:Paint、Paintbrush、Pinta等。 - Parfait
2个回答

3
我认为指定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

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

如果你需要动态计算中间值,可能会有些混乱,但这应该可以解决问题:

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

0

scale_x_discrete 中的 breaks 选项并不指定断点数量,而是以下之一:

  • NULL 表示没有断点
  • 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

希望这是你要找的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接