如何将 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::ggplotlyggplot 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 中的色标转换为对数标度的主要内容,如果未能解决你的问题,请参考以下文章

如何将颜色代码图例从对数刻度转换为实际值?

离散化 ggplot2 色标的连续标度的最简单方法?

Plotly 中的对数热图

R语言plotly可视化:使用plotly可视化模型在测试集上预测的概率分数,使用预测概率值对数据点进行配色分数越高颜色越深(visualize predictions on test split)

使用 plotly 或 Network 3D 将 igraph 转换为交互式绘图

从 R 中的 Plotly 导出 PNG 文件