在 R 中为可格式化数据着色 Table - 库存数据
Coloring Formattable Data Table in R - Stock Data
我有一个数据表存储 daily/weekly/monthly return 的几只股票,我试图用 R 的可格式化包进行着色。我希望负数 returns 为红色,正数 returns 为绿色。或者更有趣的是,为正值和负值设置单独的渐变 - 因此,如果苹果一天下跌 10%,它将是深红色,如果亚马逊下跌 2%,则该单元格将是浅红色 - 反之亦然对于正 returns(浅绿色和深绿色)。
我的问题是,当我使用红-绿渐变时,中间的颜色呈现褐色。我下面的代码将 transparent/white 作为渐变的低端,绿色作为渐变的高端,但很难区分。
我的数据表类似于:
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
我正在使用您建议的确切代码 - 颜色效果很好。但是当我像下面的例子一样按每周 return 排序时,为了获得本周表现最好的股票,它不是从最高到最低排序(当我尝试按表现最差的股票排序时有同样的问题) .
这是我的格式化输出的图片。我也在 Shiny 中 运行 这个,不确定这是否会导致排序错误。
一个可能的解决方案是创建多个 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>)
我有一个数据表存储 daily/weekly/monthly return 的几只股票,我试图用 R 的可格式化包进行着色。我希望负数 returns 为红色,正数 returns 为绿色。或者更有趣的是,为正值和负值设置单独的渐变 - 因此,如果苹果一天下跌 10%,它将是深红色,如果亚马逊下跌 2%,则该单元格将是浅红色 - 反之亦然对于正 returns(浅绿色和深绿色)。
我的问题是,当我使用红-绿渐变时,中间的颜色呈现褐色。我下面的代码将 transparent/white 作为渐变的低端,绿色作为渐变的高端,但很难区分。
我的数据表类似于:
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
我正在使用您建议的确切代码 - 颜色效果很好。但是当我像下面的例子一样按每周 return 排序时,为了获得本周表现最好的股票,它不是从最高到最低排序(当我尝试按表现最差的股票排序时有同样的问题) .
这是我的格式化输出的图片。我也在 Shiny 中 运行 这个,不确定这是否会导致排序错误。
一个可能的解决方案是创建多个 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>)