Loading pacakge

library(tourr)
library(ash)
library(reticulate)
version <- "3.9.12"
install_python(version)
## [1] "/Users/quynhnguyen/.pyenv/versions/3.9.12/bin/python3.9"
virtualenv_create("my-environment", version = version)
## virtualenv: my-environment
use_virtualenv("my-environment")

Test 1

For this question, I would like to use Olive Oil Measurement from the tourr package

f <- olive[,3:8]

Exploring the animate function

animate(f)
## Converting input data to the required matrix format.
## Using half_range 1306

animate(f, tour_path = grand_tour(), display = display_xy())
## Converting input data to the required matrix format.
## Using half_range 1306

animate(f, tour_path = grand_tour(d = 1), display = display_dist(method = "histogram"))
## Converting input data to the required matrix format.
## Using half_range 1306

Run animate with guide tour

animate(f, tour_path = guided_tour(holes()), display = display_xy())
## Converting input data to the required matrix format.
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## No better bases found after 25 tries.  Giving up.
## Final projection: 
## -0.240  -0.412  
## 0.750  0.038  
## 0.581  -0.186  
## -0.126  -0.214  
## 0.017  0.782  
## 0.162  -0.369
## Using half_range 1306

animate(f, tour_path = guided_tour(holes()), display = display_xy(col=olive$region))
## Converting input data to the required matrix format.
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## Value  1.582   0.0 % better 
## No better bases found after 25 tries.  Giving up.
## Final projection: 
## -0.180  -0.168  
## -0.317  0.444  
## 0.273  -0.385  
## 0.831  0.403  
## 0.306  -0.522  
## -0.091  -0.437
## Using half_range 1306

animate(f, tour_path = guided_tour(cmass()), display = display_xy(col=olive$area))
## Converting input data to the required matrix format.
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## Value  -0.582   -0.0 % better 
## No better bases found after 25 tries.  Giving up.
## Final projection: 
## 0.538  -0.427  
## -0.188  -0.695  
## 0.242  -0.268  
## -0.393  0.293  
## 0.053  -0.055  
## 0.677  0.417
## Using half_range 1306

Test 2

For this challenge, I followed the instruction from the matplotlib website that could be found here. Since in the instruction the author already use LassoSelector, I would like to change it into RectangleSelector and make certains adjustment.

Since I don’t think it is possible to run the code and make the interaction here in the R markdown, I would like to insert images of the code to show its function instead.

from matplotlib.widgets import RectangleSelector
from matplotlib.path import Path
import numpy as np
import matplotlib.pyplot as plt

class InteractiveSelection:

    def __init__(self, x, y, alpha=0.5):

        self.x, self.y = x, y
        self.alpha = alpha
        self.fig, self.ax = plt.subplots()
        self.canvas = self.ax.figure.canvas
        self.collection = self.ax.scatter(x, y, s = 80)

        self.xys = self.collection.get_offsets()
        self.fc = self.collection.get_fc()

        if len(self.fc) == 0:
            raise ValueError('Collection must have a facecolor')
        elif len(self.fc) == 1:
            self.fc = np.tile(self.fc,(len(self.xys), 1))
    
        self.selector = RectangleSelector(self.ax, self.onselect)
        self.selected_indices = []

    
    def onselect(self, eclick, erelease):
        x1, y1 = eclick.xdata, eclick.ydata
        x2, y2 = erelease.xdata, erelease.ydata

        matrix = [[x1, y1], [x1, y2], [x2, y2], [x2, y1]]
        path = Path(matrix)

        self.selected_indices = np.nonzero(path.contains_points(self.xys))[0]

        self.fc[:, -1] = self.alpha 
        self.fc[self.selected_indices, -1] = 1
        self.collection.set_facecolors(self.fc)
        self.canvas.draw_idle()
    
    def on_release(self):
        self.fc[:, -1] = 1 
        self.collection.set_facecolors(self.fc)
        self.canvas.draw_idle()
    
    def plotting(self):
        def accept(event):
            if event.key == 'enter':
                print('Selected points:')
                print(self.xys[self.selected_indices])
                self.on_release()
                self.fig.canvas.draw()
        self.fig.canvas.mpl_connect("key_press_event", accept)
        self.ax.set_title("Press enter to accept selected points.")
        plt.show()


if __name__ == '__main__':
    import numpy as np
    np.random.seed(42)
    x = np.random.rand(100)
    y = np.random.rand(100)
    interactive_plot = InteractiveSelection(x, y)
    interactive_plot.plotting()

Test 3

Firstly, I would export the first two columns in flea data to .txt file to use in Python

data <- flea[, 1:2]
write.table(data, file = "flea_data.txt", row.names = FALSE, col.names = FALSE)

Here is the code that I would use to create the interactive plot in Python

data = np.loadtxt("/Users/quynhnguyen/Desktop/flea_data.txt")
x, y = data[:, 0], data[:, 1]
interactive_plot = InteractiveSelection(x, y)
interactive_plot.plotting()