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")
For this question, I would like to use Olive Oil Measurement from the
tourr package
f <- olive[,3:8]
animate functionanimate(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
guide touranimate(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
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()
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()