我如何用R做一个Unicode字符水平条图?

6yoyoihd  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(106)

我想在数据框中添加一个水平条形图作为列。我可以只重复一个字符,但我想使用unicode第八块字符0x2588:0x258F,以获得更紧凑的表示。我有一个很好的解决方案,但是,我不能连接整数部分与小数部分之间没有间隙。分数unicode字符似乎左对齐,但它并不出来。

library(dplyr)
library(stringr)
intToUtf8_v <- Vectorize(intToUtf8)

bar_chars <- 
tibble(amt = (8:1)/8) |> 
  mutate(bar_val = 1:8+0x2587,
         bar_char = stringr::str_trim(intToUtf8_v(bar_val)))

bar_chars
#> # A tibble: 8 × 3
#>     amt bar_val bar_char
#>   <dbl>   <dbl> <chr>   
#> 1 1        9608 █       
#> 2 0.875    9609 ▉       
#> 3 0.75     9610 ▊       
#> 4 0.625    9611 ▋       
#> 5 0.5      9612 ▌       
#> 6 0.375    9613 ▍       
#> 7 0.25     9614 ▎       
#> 8 0.125    9615 ▏

round_to_frac <- function(value,frac){
  round(value*frac)/frac
}

build_bar <- function(value){
  whole_part = paste(rep("\U2588",times=floor(value)),
        collapse = "")
  eighth_part <- bar_chars |> 
    filter(amt == round_to_frac(value-floor(value),8)) |> 
    pull(bar_char)
  return(paste(whole_part,eighth_part,collapse = ""))
}

# I want to get rid of this gap
build_bar(2.7)
#> [1] "██ ▊"

# It should look like this
#> [1] "██▊"

字符串

fnatzsnv

fnatzsnv1#

嗯,在格式化我的问题时,我发现paste(x,y,collapse="")是错误的。paste0成功了。这是一个简洁的内嵌条形图函数。
请注意,使用data.frame() print方法进行呈现看起来不稳定,因为字段是右对齐的。cbindtibble给予了预期结果
编辑为仅使用Base R。

# unicode character bar chart 

intToUtf8_v <- Vectorize(intToUtf8)

bar_chars <- data.frame(amt = (8:1)/8,
                        bar_char = trimws(intToUtf8_v(1:8+0x2587)))

round_to_frac <- function(value,frac){
  round(value*frac)/frac
}

build_bar <- Vectorize(function(value){
  whole_part = paste(rep("\U2588",times=floor(value)),
                     collapse = "")
  frac_amt <- round_to_frac(value-floor(value),8)
  eighth_part <- 
    bar_chars[bar_chars$amt == frac_amt,"bar_char"]
  return(trimws(paste0(whole_part,eighth_part)))
  
})

values <- runif(n=5,max=10)
bars <- build_bar(values)
data.frame(values,bars)
#>      values       bars
#> 1 0.6098259          ▋
#> 2 9.2777163 █████████▎
#> 3 1.0057185          █
#> 4 7.7326423   ███████▊
#> 5 7.2826483   ███████▎
cbind(values,bars)
#>      values              bars        
#> [1,] "0.609825938008726" "▋"         
#> [2,] "9.27771626040339"  "█████████▎"
#> [3,] "1.00571852643043"  "█"         
#> [4,] "7.73264225106686"  "███████▊"  
#> [5,] "7.2826483217068"   "███████▎"
dplyr::tibble(values,bars)
#> # A tibble: 5 × 2
#>   values bars      
#>    <dbl> <chr>     
#> 1  0.610 ▋         
#> 2  9.28  █████████▎
#> 3  1.01  █         
#> 4  7.73  ███████▊  
#> 5  7.28  ███████▎

字符串
创建于2023-07-24与reprex v2.0.2现在我只会等待听到我已经重新发明了轮子。

相关问题