【问题标题】:Coloring Formattable Data Table in R - Stock DataR中的着色格式化数据表 - 库存数据
【发布时间】:2020-06-15 08:14:19
【问题描述】:

我有一个数据表,其中存储了几只股票的每日/每周/每月收益,我试图用 R 的 formattable 包着色。我希望负回报为红色,正回报为绿色。或者为了花哨,对正值和负值有一个单独的渐变 - 所以如果苹果一天下跌 10%,它会是深红色,如果亚马逊下跌 2%,那个单元格会是浅红色 - 反之亦然正回报(浅绿色和深绿色)。

我的问题是,当我使用红绿色渐变时,中间的颜色会呈现棕色。我下面的代码将透明/白色作为渐变的低端,将绿色作为渐变的上端,但很难区分。

我的数据表看起来像:

Stock day  week   month
AAPL   1.5  3.2   10.6
AMZN   3.2  5.3   4.4
BA    -2.1 -4.0  -10.5
PYPL   -5  -8.5  -12.1



Green <- "#71ca99"

sign_formatter <- formatter("span", 
                            style = x ~ style(color = ifelse(x > 0, "green", 
                                                             ifelse(x < 0, "red", "black"))))
sign_formatter(c(-1, 0, 1))

returns <- formattable(stocks_df, align =c("l","c","c","c","c"), list(
  `Stock` = formatter("span", style = ~ style(color = "grey",font.weight = "bold")), 
  daily_return = color_tile("transparent", Green),
  week_return = color_tile("transparent", Green),
  month_return = color_tile("transparent", Green)))

@dc37

我正在使用您建议的确切代码 - 颜色效果很好。但是,当我像下面的示例那样按周回报率排序时,为了获得本周表现最好的股票,它并不是从最高到最低排序(当我尝试按表现最差的股票排序时遇到同样的问题)。

这是我的可格式化输出的图片。我也在 Shiny 中运行它,不确定这是否会导致排序错误。

【问题讨论】:

    标签: r datatable formattable


    【解决方案1】:

    一种可能的解决方案是创建多个ifelse 语句,以便在每个列的值的函数中设置 5 种不同的颜色(红色/浅红色/白色/浅绿色/绿色)。

    在这里,一种可能的方式:

    Test <- formatter("span",
                      style = x ~ style(display = "block", font.weight = "bold",color = "black","border-radius" = "4px",
                                     "padding-right" = "4px",
                                     "background-color" = ifelse(x <= -10, "red", ifelse(x > -10 & x <= -2, "tomato", ifelse(x > -2 & x <= 2, "white", ifelse(x > 2 & x <= 10, "palegreen",ifelse(x > 10, "green",NA)))))),
                      x ~ percent(x/100))
    
    formattable(stocks_df,align =c("l","c","c","c","c"), list(
      `Stock` = formatter("span", style = ~ style(color = "grey",font.weight = "bold")),
      day = Test,
      week = Test, 
      month = Test))
    

    它回答了你的问题吗?

    可重现的例子

    structure(list(Stock = c("AAPL", "AMZN", "BA", "PYPL"), day = c(1.5, 
    3.2, -2.1, -5), week = c(3.2, 5.3, -4, -8.5), month = c(10.6, 
    4.4, -10.5, -12.1)), row.names = c(NA, -4L), class = c("data.table", 
    "data.frame"), .internal.selfref = <pointer: 0x55b7eeb735c0>)
    

    【讨论】:

    • 不客气;)。如果您认为此答案满足您的问题,您可以接受和/或投票以让人们知道该问题已解决。在此处查看更多信息:stackoverflow.com/help/someone-answers
    • 当我对数据表进行排序时,排序不正确(最高回报到最低回报,反之亦然)。知道为什么会这样吗?
    • 你说的sorting桌子是什么意思?您可以编辑您的问题并添加您用于对表格进行排序的代码以及它在formattable 中的样子吗?
    • 当我通过 formattable(stocks_df[order(week),] .... 将数据框排序到我的 r 会话中时,它给了我正确的排序。只尝试不带闪亮的格式化命令。如果输出正确,则说明它与 Shiny 以及数据帧的读取方式有关。
    • 我只是在一个闪亮的环境之外运行它,它的排序很好。所以看起来 Shiny 以某种方式导致了这个问题
    猜你喜欢
    • 2019-04-14
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 2014-07-19
    • 2017-10-12
    相关资源
    最近更新 更多