R:带方向箭头的矩阵

Ber*_*and 1 symbols r reinforcement-learning

我试图用 R 重现 Sutton 和 Barto(2018 年)中描述的算法,但我无法像作者在第 65 页上描述的那样生成带有箭头的矩阵:

在此处输入图片说明

为此,我尝试使用包“字段”,但没有取得多大成功。

在 Python 中,Shangtong Zhang 和 Kenta Shimada 提出的解决方案依赖于使用箭头符号: ACTIONS_FIGS=[ '?', '?', '?', '?'] 但这对 R 来说效果不佳......

编辑:我对初始动作进行编码,动作以数字方式更新如下:

library(data.table)
action_random = data.table(cell=c(1:25))
action_random$action_up = action_random$action_right = action_random$action_down =
action_random$action_left = rep(1,25)
action_random$proba = rep(1/4,25)
action_random
Run Code Online (Sandbox Code Playgroud)

我还能够调整此处发布的代码,以绘制带有简单箭头的简单网格:

arrows = matrix(c("\U2190","\U2191","\U2192","\U2193"),nrow=2,ncol=2)
grid_arrows = expand.grid(x=1:ncol(arrows),y=1:nrow(arrows))
grid_arrows$val = arrows[as.matrix(grid_arrows[c('y','x')])]

library(ggplot2)

ggplot(grid_arrows, aes(x=x, y=y, label=val)) + 
  geom_tile(fill='transparent', colour = 'black') + 
  geom_text(size = 14) + 
  scale_y_reverse() +
  theme_classic() + 
  theme(axis.text  = element_blank(),
        panel.grid = element_blank(),
        axis.line  = element_blank(),
        axis.ticks = element_blank(),
        axis.title = element_blank())
Run Code Online (Sandbox Code Playgroud)

但是:
(i) 没有 unicode 可用于上面
(ii)表 $\pi_\ast$ 中报告的漂亮的 2 是 4 向箭头......所以我没有试图对中的数值之间的双射进行编码表“action_random”和一个漂亮的带有箭头的表......

欢迎任何有助于解决问题 (i) 和 (ii) 的提示。

Viv*_*viG 6

使用该包emojifont对我来说可以获得更多 unicode 选项。在你的 ggplot 你添加family='EmojiOne'. 这是使用 unicode 的示例

更多关于 emojifont 包的信息在这里

编辑:破解 4 向箭头:

不是最漂亮或更优雅的解决方案,但您可以使用包覆盖 ggplotsmagick 以获得方向箭头。制作两个绘图图层,一个带有左右箭头 ( U+2194),另一个带有上下箭头 ( U+2195),然后合并(感谢 @Billy34 使代码更优雅):

library(data.table)
library(magick)

library(ggplot2)
library(emojifont)

#layer 1
arrows1 = matrix(c("\U21B4","\U2195","\U2192","\U2193"),nrow=2,ncol=2)
grid_arrows1 = expand.grid(x=1:ncol(arrows1),y=1:nrow(arrows1))
grid_arrows1$val = arrows1[as.matrix(grid_arrows1[c('y','x')])]

#layer 2
arrows2 = matrix(c("\U21B4","\U2194","\U2192","\U2193"),nrow=2,ncol=2)
grid_arrows2 = expand.grid(x1=1:ncol(arrows2),y1=1:nrow(arrows2))
grid_arrows2$val = arrows2[as.matrix(grid_arrows2[c('y1','x1')])]

ggplot(grid_arrows1, aes(x=x, y=y, label=val),family='EmojiOne') + 
  geom_tile(fill='NA', colour = 'black') + 
  
  geom_text(size = 18) + 
  
  geom_text(grid_arrows2,mapping =  aes(x=x1, y=y1, label=val),size = 18) +
  scale_y_reverse() +
  theme_classic() + 
  theme(
        panel.background = element_rect(fill = "transparent"), # bg of the panel
    plot.background = element_rect(fill = "transparent", color = NA), # bg of the plot
axis.text  = element_blank(),
        panel.grid = element_blank(),
        axis.line  = element_blank(),
        axis.ticks = element_blank(),
        axis.title = element_blank()# get rid of legend panel bg
  ) 
  
#save plot as image
ggsave(filename = 'plot1.png', device = 'png', bg = 'transparent') 


# read images with package magick
 plot1 <- image_read('plot1.png')

image_mosaic(plot1)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

更新:

和之前的代码一样粗鲁,但更接近你正在寻找的......

某些 Unicode 仅适用于某些字体,因此第一步是找到哪些字体适用于您正在寻找的 Unicode。下面是对下面示例中使用的一种向左箭头类型的字体支持示例

当然,名单上的字体没有一个是标准的,因为生活并不那么容易。所以下一步是安装字体。我使用了我在这里下载的字体Symbola。如果您正在使用项目,请将字体文件复制到 R 目录或项目文件夹。

然后使用库showtext。该包允许您在图形中使用系统字体(需要包sysfonts)。如果字体在您的操作系统中是标准的,我建议您查看systemfonts包。

在我的示例中,我使用了箭头\U1F800\U1F801,然后,就像在我之前的示例中一样,我将它们重叠(PS:您可能需要在nudge_ynudge_xin 中混混 geom_text才能使它们正确对齐)

library(data.table)
library(magick)
library(ggplot2)
library(showtext)



#layer 1, upwards arrow
arrows1 = matrix(c("", "\U1F801", "\U1F801", ""),
                 nrow = 2,
                 ncol = 2)
grid_arrows1 = expand.grid(x = 1:ncol(arrows1), y = 1:nrow(arrows1))
grid_arrows1$val = arrows1[as.matrix(grid_arrows1[c('y', 'x')])]

#layer 2 , leftwards arrow
arrows2 = matrix(c("", "\U1F800", "\U1F800", ""),
                 nrow = 2,
                 ncol = 2)
grid_arrows2 = expand.grid(x1 = 1:ncol(arrows2), y1 = 1:nrow(arrows2))
grid_arrows2$val = arrows2[as.matrix(grid_arrows2[c('y1', 'x1')])]

#layer 3 , upwards arrow
arrows3  = matrix(c("\U1F801", "", "", "\U1F801"),
                  nrow = 2,
                  ncol = 2)
grid_arrows3 = expand.grid(x2 = 1:ncol(arrows3), y2 = 1:nrow(arrows3))
grid_arrows3$val = arrows3[as.matrix(grid_arrows3[c('y2', 'x2')])]

#layer 4 , leftwards arrow
arrows4 = matrix(c("\U1F800", "", "", "\U1F800"),
                 nrow = 2,
                 ncol = 2)
grid_arrows4 = expand.grid(x3 = 1:ncol(arrows4), y3 = 1:nrow(arrows4))
grid_arrows4$val = arrows4[as.matrix(grid_arrows4[c('y3', 'x3')])]

#use function font_add from lybrary showtext
 font_add("Symbola", regular = "Symbola_hint.ttf")
# Take a look at the function showtext_auto() as well

 ggplot(grid_arrows1,
        aes(x = x, y = y, label = val),
        family = 'Symbola',
        size = 18) +
   
   geom_tile(fill = 'NA', colour = 'black') +
   geom_text(
     grid_arrows1,
     mapping = aes(x = x, y = y, label = val),
     family = 'Symbola',
     size = 18
   ) +
   
   geom_text(
     grid_arrows2,
     mapping =  aes(x = x1, y = y1, label = val),
     family = 'Symbola',
     size = 18,
     nudge_x = -0.01
   ) +
   geom_text(
     grid_arrows1,
     mapping =  aes(x = x, y = y, label = val),
     family = 'Symbola',
     size = 18,
     angle = 180
   ) +
   geom_text(
     grid_arrows2,
     mapping =  aes(x = x1, y = y1, label = val),
     family = 'Symbola',
     size = 18,
     angle = 180,
     nudge_x = 0.01,
     nudge_y = 0.007
   ) +
   geom_text(
     grid_arrows3,
     mapping =  aes(x = x2, y = y2, label = val),
     family = 'Symbola',
     size = 17,
     nudge_y = 0.03
   ) +
   geom_text(
     grid_arrows4,
     mapping =  aes(x = x3, y = y3, label = val),
     family = 'Symbola',
     size = 17,
     nudge_x = -0.021,
     nudge_y = -0.01
   ) +
   
   scale_y_reverse() +
   theme_classic() +
   theme(
     panel.background = element_rect(fill = "transparent"),
     # bg of the panel
     plot.background = element_rect(fill = "transparent", color = NA),
     # bg of the plot
     axis.text  = element_blank(),
     panel.grid = element_blank(),
     axis.line  = element_blank(),
     axis.ticks = element_blank(),
     axis.title = element_blank()# get rid of legend panel bg
   ) 
 
 #save plot as image
 ggsave(filename = 'plot.png',
        device = 'png',
        bg = 'transparent')
 
 # read images with package magick
 image_read('plot.png')
Run Code Online (Sandbox Code Playgroud)

这是我得到的结果:

在此处输入图片说明

我不能说这是有史以来最漂亮的代码,它是最先进的,但它可能会有所帮助!(完成这项工作花费的时间比我想承认的要多!)