10

Often when I am learning new machine learning methods or experimenting with a data analysis algorithm I need to generate a series of 2D points. Teachers also do this often when making a lesson or tutorial.

In some cases I just create a function, add some noise, and plot it, but there are many times when I wish I could just click my mouse on a graph to generate points. For instance, when I want to generate a fairly complex relationship between x and y, it's a hassle to think of the right formulation to generate the points programmatically.

Does there exist a tool that will allow me to generate data points using my mouse, with an option to export to CSV (or other simple format)?

For example, I am currently learning how to use mutual information and entropy as a metric of dependence between variables. I'd like to see what happens when I have data that is clearly dependent but does not have a linear relationship, so I drew this image:

Non-linear dependence

Now I just need a way to export the coordinates of the points to CSV. I realize this is a simple program and I could write my own, but surely someone has already done this and created a tool to do so? It could be a website, an .exe, Python source, or any other application.

MD004
  • 310
  • 1
  • 3
  • 10

5 Answers5

10

I recently discovered this site: https://guoguibing.github.io/librec/datagen.html

Outputs list of points, and color ID (class) for each point.

Screenshot: Datagen screenshot

MD004
  • 310
  • 1
  • 3
  • 10
mcaradec
  • 109
  • 2
3

In R:

First set up a blank plot with whatever x and y scale limits you need:

plot(NA, xlim=c(11,20),ylim=c(10,99))

Then click click click with mouse-button 1 and end with mouse-button 2 (probably):

pts = data.frame(locator(type="p"))

Then save as a CSV file:

write.csv(pts,"pts.csv",row.names=FALSE)

producing:

"x","y"
20.9461142167608,54.0921852908633
11.6463003491398,24.5409354249845
14.4239385175408,44.1769632963908
14.7755382856928,29.5957544809901
14.7931182741004,62.8409105801038
Spacedman
  • 2,042
  • 12
  • 17
2

https://drawdata.xyz/

I think this one also good, the highest vote one, you have to click one by one to generate more data points, this one is much faster...

enter image description here

Yiffany
  • 158
  • 1
  • 7
0

Just updating the other answers.

You could use this site: https://guoguibing.github.io/librec/datagen.html

to make it a dataframe:

points = pd.read_csv('/content/pontos.csv', sep='\n', delimiter=',', names=['x','y','class'])

enter image description here

0

I found a simple Python solution, adapted from https://stackoverflow.com/q/25521120/1265192

This also works in a Jupyter Notebook, if desired.

import numpy as np
import matplotlib.pyplot as plt

%matplotlib qt

fig = plt.figure(figsize=(8,6)) ax = fig.add_subplot(111) ax.set_xlim(0,800) ax.set_ylim(0,600)

plt.grid(True)

coords = []

def onclick(event): x, y = event.xdata, event.ydata

print(f'{x:0.1f},{y:0.1f}')

global coords
coords.append((x, y))

ax.scatter([x], [y], c='b', s=150)
plt.draw()

cid = fig.canvas.mpl_connect('button_press_event', onclick)

fig.show()

The coordinates are stored in coords and also printed to the screen (but with 1 decimal place). One could save the coordinates to a file, but I just copy/paste the printed coordinates wherever I want them.

MD004
  • 310
  • 1
  • 3
  • 10