如何将 Plotly r 中的色标转换为对数标度
Posted
技术标签:
【中文标题】如何将 Plotly r 中的色标转换为对数标度【英文标题】:How to turn the color scale in Plotly r to log scale 【发布时间】:2020-03-24 16:23:02 【问题描述】:我正在尝试为 R 中的颜色条设置对数刻度,有什么想法可以做到吗?
我的代码:
TEST_DATAFRAME = read.table(TEST_FILE, sep="\t",skip=2, header=T)
PROD_DATAFRAME = read.table(PROD_FILE, sep="\t",skip=2, header=T)
PARAMETER = "Vf_High"
LST_RESIDUAL <- PROD_DATAFRAME[PARAMETER] - TEST_DATAFRAME[PARAMETER]
PARAM_DATAFRAME <- data.frame("NEW_MEASUREMENT" = TEST_DATAFRAME[PARAMETER],
"OLD_MEASUREMENT" = PROD_DATAFRAME[PARAMETER],
"RESIDUAL" = LST_RESIDUAL)
colnames(PARAM_DATAFRAME) <- c("NEW_MEASUREMENT","OLD_MEASUREMENT","RESIDUAL")
p <- plot_ly(PARAM_DATAFRAME, x = ~OLD_MEASUREMENT, y = ~NEW_MEASUREMENT, color=~RESIDUAL, colorscale = "Log",
hovertext = paste("<b>New Measurement :</b>", PARAM_DATAFRAME$NEW_MEASUREMENT,
"<br><b>Old Measurement :</b>", PARAM_DATAFRAME$OLD_MEASUREMENT,
"<br><b>Residual :</b>" , PARAM_DATAFRAME$RESIDUAL)) %>% add_markers()
#p <- layout(p, color = list(type = "log"))
p
这是我当前的输出:
我也试过下面的代码:
TEST_DATAFRAME = read.table(TEST_FILE, sep="\t",skip=2, header=T)
PROD_DATAFRAME = read.table(PROD_FILE, sep="\t",skip=2, header=T)
PARAMETER = "Vf_High"
LST_RESIDUAL <- PROD_DATAFRAME[PARAMETER] - TEST_DATAFRAME[PARAMETER]
PARAM_DATAFRAME <- data.frame("NEW_MEASUREMENT" = TEST_DATAFRAME[PARAMETER],
"OLD_MEASUREMENT" = PROD_DATAFRAME[PARAMETER],
"RESIDUAL" = abs(LST_RESIDUAL))
colnames(PARAM_DATAFRAME) <- c("NEW_MEASUREMENT","OLD_MEASUREMENT","RESIDUAL")
brks <- pretty(range(PARAM_DATAFRAME$RESIDUAL))
gg <- ggplot(PARAM_DATAFRAME, aes(NEW_MEASUREMENT, OLD_MEASUREMENT, color = RESIDUAL)) +
geom_point() +
scale_colour_gradient(
low = "blue", high = "red",
trans = "log", breaks = brks, labels = brks) +
theme_minimal()
ggplotly(gg)
这是结果:
我怎样才能给它清晰的标签? 我想将彩条配置如下:
【问题讨论】:
【参考方案1】:您可以使用ggplot
生成对数色标,然后让plotly::ggplotly
将ggplot
grob 变成一个绘图对象。
由于您不提供可重现的样本数据,这里是基于mtcars
的示例
brks <- pretty(range(mtcars$disp))
gg <- ggplot(mtcars, aes(mpg, wt, colour = disp)) +
geom_point() +
scale_colour_gradient(
low = "blue", high = "red",
trans = "log", breaks = brks, labels = brks) +
theme_minimal()
ggplotly(gg)
更新
作为对您的评论的回应,这里是一个最小的可重现示例。
首先我们生成一些样本数据
set.seed(2018)
df <- data.frame(
x = 1:100,
y = 1:100 + rnorm(100),
val = 10^seq(-5, 2, length.out = 100))
然后我们定义合适的休息时间
brks <- 10^seq(floor(log10(min(df$val))), ceiling(log10(max(df$val))), by = 1)
生成ggplot
grob
gg <- ggplot(df, aes(x, y, colour = val)) +
geom_point() +
scale_colour_gradient(
low = "blue", high = "red",
trans = "log",
breaks = brks,
labels = brks) +
theme_minimal()
最后显示为plotly
对象
ggplotly(gg)
不使用ggplotly
要在不使用ggplotly
绕行的情况下实现相同的效果,请使用marker
中的colorbar
参数来定义刻度间距和标签。
# Determine range of log10-scale
rg <- range(log10(df$val))
# Plot
plot_ly(
df,
x = ~x, y = ~y,
type = "scatter",
mode = "markers",
marker = list(
color = ~log10(val),
colorbar = list(
tickmode = "array",
ticktext = 10^seq(floor(rg[1]), ceiling(rg[2])),
tickvals = seq(floor(rg[1]), ceiling(rg[2])))))
【讨论】:
我修改了答案,请查看 @Adhil 不清楚你在问什么。请通过包含minimal & reproducible data & code 使您的示例可重现。我们无权访问这些文件中的任何一个,所以没有任何具体的东西可以使用。 它是一个相当大的测试数据文件,大部分残差在 0 -0.01 之间,但是在 1 和 2 之间有异常残差,我想在色标中显示,但是,我有在彩条上实现对数刻度有困难,您给我的代码效果很好,但是彩条上的数字标签不清楚,无论如何我可以清理它吗? @kosk 请查看我的最新编辑。 @kosk 是的,我很确定这应该不会太难。我看过你的帖子,但它缺少一些有代表性的样本数据。没有样本数据,很难用一个具体的例子来证明。以上是关于如何将 Plotly r 中的色标转换为对数标度的主要内容,如果未能解决你的问题,请参考以下文章
R语言plotly可视化:使用plotly可视化模型在测试集上预测的概率分数,使用预测概率值对数据点进行配色分数越高颜色越深(visualize predictions on test split)