आर: दिशात्मक तीर के साथ मैट्रिक्स

Jan 03 2021

मैं R के साथ Sutton और Barto (2018) में वर्णित एक एल्गोरिथ्म को फिर से शुरू करने की कोशिश कर रहा हूं, लेकिन मैं तीर के साथ एक मैट्रिक्स का उत्पादन करने में सक्षम नहीं था जैसा कि पृष्ठ 65 पर लेखकों द्वारा वर्णित है:

मैंने इस उद्देश्य के लिए पैकेज "फ़ील्ड" का उपयोग करने की कोशिश की, लेकिन बहुत अधिक सफलता के बिना।

पायथन में शांगटोंग झांग और केंटा शिमदा द्वारा प्रस्तावित समाधान तीरों के प्रतीकों का उपयोग करने पर निर्भर करता है: 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

मैं यहां पोस्ट किए गए कोड को सरल तीर के साथ एक साधारण ग्रिड आकर्षित करने में भी सक्षम था :

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())

हालाँकि:
(i) अच्छा 2 के लिए कोई यूनिकोड उपलब्ध नहीं है, तालिका में 4-दिशात्मक तीर बताए गए हैं$\pi_\ast$ऊपर
(ii) ... और इसलिए मैं तालिका "एक्शन_रंग" में संख्यात्मक मानों और उसमें तीर के साथ एक अच्छी तालिका के बीच की आपत्ति को कोड करने की कोशिश नहीं कर रहा था ...

मुद्दों को हल करने में मदद करने वाले किसी भी संकेत (i) और (ii) का स्वागत है।

जवाब

1 AbdurRohman Jan 21 2021 at 22:01

मैट्रिक्स को पुन: उत्पन्न करने के लिए एक ग्रिड + जाली तरीका है:

library(grid)
library(lattice)

grid.newpage()
pushViewport(viewport(width = 0.8, height = 0.8)) 
grid.rect(width = 1, height = 1)
panel.grid(h = 4, v = 4)

direct = function(xCenter, yCenter, type){
  
  d= 0.05
  
  north = function(xCenter, yCenter){ 
    grid.curve(xCenter, yCenter-d ,xCenter, yCenter+d, 
               ncp = 1, angle = 90, gp=gpar(lwd=1, fill="black"),
               inflect = FALSE, shape = 0,
               arrow = arrow(type="closed", ends = "last", 
                      angle = 30, length = unit(0.2, "cm")))}
  
  west = function(xCenter, yCenter){
    grid.curve(xCenter+d, yCenter ,xCenter-d, yCenter, 
               ncp = 1, angle = 90, gp=gpar(lwd=1, fill="black"),
               inflect = FALSE, shape = 0,
               arrow = arrow(type="closed", ends = "last", 
                             angle = 30, length = unit(0.2, "cm")))}
  east = function(xCenter, yCenter){
    grid.curve(xCenter+d, yCenter ,xCenter-d, yCenter, 
               ncp = 1, angle = 90, gp=gpar(lwd=1, fill="black"),
               inflect = FALSE, shape = 0,
               arrow = arrow(type="closed", ends = "first", 
                             angle = 30, length = unit(0.2, "cm")))}
  
  northeast = function(xCenter, yCenter){
       grid.curve(xCenter-d, yCenter+d ,xCenter+d, yCenter-d, 
                 ncp = 1, angle = 90, gp=gpar(lwd=1, fill="black"),
                 inflect = FALSE, shape = 0,
                 arrow = arrow(type="closed", ends = "both", 
                         angle = 30, length = unit(0.2, "cm")))}
  
  northwest = function(xCenter, yCenter){
       grid.curve(xCenter-d, yCenter-d ,xCenter+d, yCenter+d, 
               ncp = 1, angle = 90, gp=gpar(lwd=1, fill="black"),
               inflect = FALSE, shape = 0,
               arrow = arrow(type="closed", ends = "both", 
                             angle = 30, length = unit(0.2, "cm")))}
  all = function(xCenter, yCenter){
      grid.curve(xCenter+d, yCenter ,xCenter-d, yCenter, 
                 ncp = 1, angle = 90, gp=gpar(lwd=1, fill="black"),
                 inflect = FALSE, shape = 0,
                 arrow = arrow(type="closed", ends = "both", 
                               angle = 30, length = unit(0.2, "cm")))
      grid.curve(xCenter, yCenter-d ,xCenter, yCenter+d, 
             ncp = 1, angle = 90, gp=gpar(lwd=1, fill="black"),
             inflect = FALSE, shape = 0,
             arrow = arrow(type="closed", ends = "both", 
                           angle = 30, length = unit(0.2, "cm")))}
  switch(type,
         'n' = north(xCenter, yCenter),
         'e' = east(xCenter, yCenter),
         'w' = west(xCenter, yCenter),
         'nw'= northwest(xCenter, yCenter),
         'ne' = northeast(xCenter, yCenter),
         'all' = all(xCenter, yCenter)
         )
}

x = seq(0.1, 0.9, by = 0.2)
y = x
centers = expand.grid(x0 = x, y0 = y)

row1 = row2 = row3 = c('ne','n', rep('nw',3))
row4 = c('ne','n','nw','w','w')
row5 = c('e','all','w','all','w')

dir = c(row1,row2,row3,row4,row5)
df = data.frame(centers, dir)

for (k in 1:nrow(df)) direct(df$x0[k], df$y0[k], df$dir[k])
grid.text(bquote(~pi["*"]), y = -0.05)

5 ViviG Jan 14 2021 at 21:33

पैकेज का उपयोग करना emojifontमेरे लिए अधिक यूनिकोड विकल्प प्राप्त करने के लिए काम करता है। अपने ggplot में आप जोड़ते हैं family='EmojiOne'। यहां यूनिकोड का उपयोग करके एक उदाहरण दिया गया है

यहाँ पैकेज इमोजीफोंट के बारे में अधिक

संपादित करें : 4-दिशात्मक तीर के लिए हैक:

सबसे सुंदर या अधिक सुरुचिपूर्ण समाधान नहीं है, लेकिन आप magickदिशात्मक तीर प्राप्त करने के लिए पैकेज का उपयोग करके ggplots ओवरले कर सकते हैं । दो प्लॉट लेयर बनाएं, एक लेफ्ट-राईट एरो ( 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)

अपडेट करें:

पिछले कोड के रूप में असंगत के रूप में, लेकिन आप के लिए क्या देख रहे हैं के करीब ...

कुछ यूनिकोड केवल कुछ फोंट के साथ काम करते हैं, इसलिए पहला चरण यह है कि आप जो यूनिकोड खोज रहे हैं उसके लिए कौन से फोंट काम करते हैं। नीचे दिए गए उदाहरण में उपयोग किए गए एक प्रकार के बाईं ओर तीर के लिए फ़ॉन्ट समर्थन का एक उदाहरण है ।

बेशक, सूची में कोई भी फोंट मानक नहीं है, क्योंकि जीवन इतना आसान नहीं है। तो अगला चरण फ़ॉन्ट स्थापित है। मैंने यहाँ डाउनलोड किए जाने वाले फ़ॉन्ट सिम्बोला का उपयोग किया । यदि आप परियोजनाओं का उपयोग कर रहे हैं, तो फॉन्ट फ़ाइल को अपनी आर निर्देशिका या अपने प्रोजेक्ट फ़ोल्डर में कॉपी करें।

फिर लाइब्रेरी शोटेक्स का उपयोग करें । पैकेज आपको ग्राफिक्स में सिस्टम फोंट का उपयोग करने की अनुमति देता है (पैकेज की आवश्यकता है sysfonts)। यदि फ़ॉन्ट आपके ओएस में मानक है, तो मैं आपको पैकेज systemfonts को देखने की सलाह देता हूं ।

मेरे उदाहरण में मैं तीर का इस्तेमाल किया \U1F800और \U1F801, फिर, मेरे पिछले उदाहरण की तरह, मैं उन्हें ओवरलैप ( पुनश्च: आप के साथ चारों ओर मूर्ख हो सकता है nudge_yऔर nudge_xमें 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')

यहाँ परिणाम मुझे मिला है:

मैं यह नहीं कह सकता कि यह अब तक का सबसे सुंदर कोड है, यह जितना मिलता है उतना हैक होता है, लेकिन यह मददगार हो सकता है! (मुझे यह स्वीकार करने में अधिक समय लगा, मैं स्वीकार करना चाहूंगा!)