Add and remove points to a scatter plot repeatedly

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Add and remove points to a scatter plot repeatedly

regev81
I am trying to add and remove points to a scatter plot repeatedly, each time
with a different set of points,  while a wireframe plot is in the
background.
is there a way to do so with out closing the all figure window and the
background wireframe plot?

Thanks

Here is my python code:
import gdal
from mpl_toolkits.mplot3d.axes3d import *
import matplotlib.pyplot as plt
from pathlib import Path

#import the raster tif file and convert to 2d array
dataset = gdal.Open("dem_demo.tif")
dem_arr = dataset.ReadAsArray()

#slicing
#dem_arr[start row:end row,start col:end col]
sliced_dem_arr = dem_arr[100:151,100:151]
rowCount = sliced_dem_arr.shape[0]
colCount = sliced_dem_arr.shape[1]

#set the X, Y, Z arrays for plotting process
rowArr = np.arange(1,rowCount+1)
colArr = np.arange(1,colCount+1)
X, Y = np.meshgrid(rowArr, colArr)
Z = sliced_dem_arr

#set 3d view ans labels
ax = plt.axes(projection='3d')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

############plotting the dtm ########################
###wireframe
ax.plot_wireframe(X, Y, Z, color='green')

#Add points #01
points_list = [(2,6),(30,14),(39,15)]
for p in points_list:
    ax.scatter(p[0], p[1], sliced_dem_arr[p[0],p[1]], c = 'r')
plt.show()

#Add points #02
points_list2 = [(5,23),(24,4),(12,45)]
for p in points_list2:
    ax.scatter(p[0], p[1], sliced_dem_arr[p[0],p[1]], c = 'r')
plt.show()

<http://matplotlib.1069221.n5.nabble.com/file/t5275/example.jpeg>



--
Sent from: http://matplotlib.1069221.n5.nabble.com/matplotlib-users-f3.html
_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Add and remove points to a scatter plot repeatedly

matplotlib - users mailing list
You could use animation.  See https://stackoverflow.com/questions/41602588/matplotlib-3d-scatter-animations 

Here is a short example based on the Matplotlib wireframe example (https://matplotlib.org/3.1.1/gallery/mplot3d/wire3d.html) and your two sets of points.  This will work in a Jupyter notebook if you use the  %matplotlib notebook  magic command but the animation does not work with jupyter lab.


import numpy as np
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import matplotlib.animation


def update_graph(num):
    # alternate between the 2 sets of points
    num = 3 * (num % 2)
    data = points[num:num+3]
    dots.set_data (data[:,0], data[:,1])
    dots.set_3d_properties(data[:,2])
    return dots,


fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(111, projection='3d')

# Plot a basic wireframe.
X, Y, Z = axes3d.get_test_data(0.05)
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10, color='green')

# set up the points to be plotted
points_list = np.array([(2,6),(30,14),(39,15)])
points = np.append(points_list,
                  Z[points_list[:,0], points_list[:,1]].reshape(3,1),
                  1)
points_list2 = np.array([(5,23),(24,4),(12,45)])
points = np.append(points,
                  np.append(points_list2, Z[points_list2[:,0], points_list2[:,1]].reshape(3,1), 1),
                  0)

dots, = ax.plot(points[:,0][:3], points[:,1][:3], points[:,2][:3],
                linestyle="", marker="o", c='r')


ani = matplotlib.animation.FuncAnimation(fig, update_graph, 2,
                               interval=500, blit=True)
plt.show()


I ran the example with matplotlib 3.1.1 in python 3.8.

Hth,
Scott


> On Dec 3, 2019, at 10:09 AM, regev81 <[hidden email]> wrote:
>
> I am trying to add and remove points to a scatter plot repeatedly, each time
> with a different set of points,  while a wireframe plot is in the
> background.
> is there a way to do so with out closing the all figure window and the
> background wireframe plot?
>
> Thanks
>
> Here is my python code:
> import gdal
> from mpl_toolkits.mplot3d.axes3d import *
> import matplotlib.pyplot as plt
> from pathlib import Path
>
> #import the raster tif file and convert to 2d array
> dataset = gdal.Open("dem_demo.tif")
> dem_arr = dataset.ReadAsArray()
>
> #slicing
> #dem_arr[start row:end row,start col:end col]
> sliced_dem_arr = dem_arr[100:151,100:151]
> rowCount = sliced_dem_arr.shape[0]
> colCount = sliced_dem_arr.shape[1]
>
> #set the X, Y, Z arrays for plotting process
> rowArr = np.arange(1,rowCount+1)
> colArr = np.arange(1,colCount+1)
> X, Y = np.meshgrid(rowArr, colArr)
> Z = sliced_dem_arr
>
> #set 3d view ans labels
> ax = plt.axes(projection='3d')
> ax.set_xlabel('x')
> ax.set_ylabel('y')
> ax.set_zlabel('z')
>
> ############plotting the dtm ########################
> ###wireframe
> ax.plot_wireframe(X, Y, Z, color='green')
>
> #Add points #01
> points_list = [(2,6),(30,14),(39,15)]
> for p in points_list:
>    ax.scatter(p[0], p[1], sliced_dem_arr[p[0],p[1]], c = 'r')
> plt.show()
>
> #Add points #02
> points_list2 = [(5,23),(24,4),(12,45)]
> for p in points_list2:
>    ax.scatter(p[0], p[1], sliced_dem_arr[p[0],p[1]], c = 'r')
> plt.show()
>
> <http://matplotlib.1069221.n5.nabble.com/file/t5275/example.jpeg>
>
>
>
> --
> Sent from: http://matplotlib.1069221.n5.nabble.com/matplotlib-users-f3.html
> _______________________________________________
> Matplotlib-users mailing list
> [hidden email]
> https://mail.python.org/mailman/listinfo/matplotlib-users

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Add and remove points to a scatter plot repeatedly

regev81
Thanks, Scott.

But i create the scatter plots in runtime and i want to present them when i
want by a function and not by a time interval.
Is there a way to do so ?





--
Sent from: http://matplotlib.1069221.n5.nabble.com/matplotlib-users-f3.html
_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users