如何仅使用部分数字变量在geom_tile ggplot中对图块进行排序

问题描述

我正在尝试使用geom_tile将数据以pivot_long形式绘制为热图。 但是我在订购图中的瓷砖时遇到了麻烦。

样本数据https://drive.google.com/file/d/1WIjbN9-xP-1Wgc2Nx3GlterV8XhtnGyu/view?usp=sharing

这是我生成的数字:

问题是我希望添加y轴标签,又名“ Drug.dose”,在组合的“无”部分中按数值从高到低排序(因子设置为无,I30,I300 ... 。I300_V100)

我的绘图代码如下:通过在y轴(How to preserve the order of tiles in geom_tile ggplot)上使用reorder(),它按组合添加的所有内容从高到低排名,因此您看到的我最高的是TN 0.1,但由于I30,I300等中的所有零,因此它移到了图形的底部。列表中还存在其他不一致之处。

如何仅通过添加的“组合”的“无”部分来重新排序?

library(ggplot2)

m <- ggplot(data)+
  geom_tile(aes(x=Combination,y=reorder(Drug.dose,Avg.percent),fill=Avg.percent))+
  geom_text(aes(x=Combination,label=Avg.percent),size=3)+
  scale_fill_gradientn(colors=pal)+
  theme(legend.text = element_text(size=10,face="bold",color = "black"))+
  theme(axis.text.x = element_text(size = 15,color = "black")) +
  theme(axis.text.y = element_text(size = 9,color = "black")) +
  theme(axis.title.x = element_text(size = 15,color = "black",vjust = 3))+
  theme(axis.title.y = element_text(size = 15,hjust = 0.5))+
  theme(plot.title = element_text(size = 16))+
  theme(strip.text.y  = element_text(size = 10,face = "bold",color = "black"))+
  scale_x_discrete(position ="top") +
  xlab("Combination added")+
  ylab("Treatments in the screen")+
  ggtitle("Cluster 1 Enriched in TN response")


print(m)

 

enter image description here

解决方法

像这样?只需创建一个静态变量即可管理ya的颜色渐变。

@IBAction func markAsDonePressed(_ sender: UIButton) {
        let picker = UIImagePickerController()
        picker.sourceType = .camera
        picker.delegate = self
        present(picker,animated: true)
    }

   @IBAction func plusPressed(_ sender: UIButton) {
        
        let picker = UIImagePickerController()
        picker.sourceType = .camera
        picker.delegate = self
        present(picker,animated: true)
        
    }


func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        
        picker.dismiss(animated: true,completion: nil)
        
        guard let plusPressedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else { return }
        
        guard let markAsDoneImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage else { return }
                
    }
,

我认为最好的方法是在将数据放入ggplot之前先对其进行排序。可能有使用tidyr或其他方法的解决方案,但我对此并不了解。

Combination=="none"时获取配对值,并按Avg.percent对其进行排序:

index = data[data$Combination=="none",c("Drug.dose","Avg.percent")]
index = index[order(index$Avg.percent),]

创建变量order,为index中的每个级别提供Drug.dose上的值:

for(i in unique(data$Drug.dose)){
  data$order[data$Drug.dose==i] = index[index$Drug.dose==i,2]}

然后在order中的Avg.percent处使用reorder()。输出(按级别“无”的顺序应该是第一行):

enter image description here