10
$\begingroup$

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.

$\endgroup$
0

5 Answers 5

2
$\begingroup$

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

$\endgroup$
1
  • $\begingroup$ I like how fast it is to draw many points. One downside: can't draw single points if you wanted. $\endgroup$
    – MD004
    Commented Jul 31, 2023 at 21:06
9
$\begingroup$

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

$\endgroup$
3
  • $\begingroup$ In Python, one can convert the output from this website to a Pandas Dataframe using points = pandas.read_csv(io.BytesIO(pointsTxt), sep='\n', delimiter=',', names=['x','y','class']) $\endgroup$
    – MD004
    Commented Apr 7, 2017 at 18:16
  • $\begingroup$ Sadly, this website is no longer online :( $\endgroup$
    – MD004
    Commented Dec 24, 2020 at 1:15
  • $\begingroup$ ...but I found a working link and have updated the link above. $\endgroup$
    – MD004
    Commented Jan 6, 2022 at 19:28
3
$\begingroup$

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
$\endgroup$
1
  • $\begingroup$ Still need a way to add classes $\endgroup$
    – 27px
    Commented Oct 3, 2023 at 11:37
0
$\begingroup$

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.

$\endgroup$
0
$\begingroup$

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

$\endgroup$
1
  • $\begingroup$ Thanks for posting! However, one of the other answers already suggested this tool. Oh! But I see you found a URL that works, whereas the other answer has a broken link. We can edit that answer with the new link. $\endgroup$
    – MD004
    Commented Sep 30, 2021 at 22:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.