我最近更新了R和Rstudio,现在我写的脚本很多都被打破了.
特别是导致我问题的一件事是下面的脚本.以前,用于输出热图正是因为它出现在我给它做矩阵值的CSV.现在,后来的版本似乎改变了他们订购的方式.它现在按升序数字顺序排列列及其标签,这使它们无序.如何防止它重新排列列,或指定它按照我提供的方式处理它们?
次要的美学问题并不是一个问题.
这是代码:
library(ggplot2)
library(plotly)
library(RColorBrewer)
# Read in data
library(readr)
adjwallace <- read.csv() # see the link for the actual data http://pastebin.com/bBLs8uLt
rownames(adjwallace_recluster)[17] <- "Species" #Rename STree
names(adjwallace_recluster)[17] <- "Species"
# Preferences for xaxis
font.pref <- list(
size = 20,
family = "Arial, sans-serif",
color = "black"
)
x.axisSettings <- list(
title = "",
zeroline = FALSE,
showline = FALSE,
showticklabels = TRUE,
tickfont = font.pref,
showgrid = TRUE
)
# Preferences for yaxis
y.axisSettings <- list(
title = "",
zeroline = FALSE,
showline = FALSE,
showticklabels = TRUE,
tickfont = font.pref,
showgrid = TRUE
)
margins <- list(
l = 50,
r = 10,
b = 50,
t = 10,
pad = 1
)
# Plot graph as a heatmap
p <-plot_ly(z = ~data.matrix(adjwallace),
colors = "YlOrRd",
name = "Adjusted Wallace Coefficients",
x = names(adjwallace),
y = names(adjwallace),
colorbar = list(title = "Adjusted Wallace <br> Coefficient", titlefont = font.pref),
type = "heatmap") %>%
layout(xaxis=x.axisSettings,
yaxis=y.axisSettings,
plot_bgcolor='rgba(0,0,0,0)',
paper_bgcolor='rgba(0,0,0,0)',
margin = margins
)
p
Run Code Online (Sandbox Code Playgroud)
新旧热图中的值实际上是相同的; 您的标签只是被重新排序.这是当前版本的一个奇怪的行为(我会让别人决定是否称它为"bug").轴标签按字母顺序重新排序.这是一个明确显示它的MWE:
dat <- matrix(c(1,2,3), nrow = 30, ncol = 30)
dimnames(dat) <- list(rownames(dat, FALSE, "r"),
colnames(dat, FALSE, "c"))
plot_ly(z=dat, x=colnames(dat), y = rownames(dat),
type = "heat map")
Run Code Online (Sandbox Code Playgroud)
由于在当前版本的plotly中的这种行为,我建议使用ggplot2代替.事实上,您可以用更少的行来到达原始地块,如下所示:
adjwallaceX <- melt(t(as.matrix(adjwallace)))
ggplot(data = adjwallaceX, aes(x = Var1, y = Var2)) +
geom_tile(aes(fill = value)) +
coord_equal() +
scale_fill_gradientn(colours = rev(brewer.pal(9,"YlOrRd"))) +
labs(fill='Adjusted Wallace Coefficient') +
theme(axis.title.x=element_blank(),
axis.title.y=element_blank(),
axis.text.x=element_text(angle = 315, hjust = 0))
Run Code Online (Sandbox Code Playgroud)