Part of my moving to python for science.
I have lately been using gnuplot to monitor the progress and end results of my simulations. These are 2D hydrodynamic simulations, which involve 2D scalar and vector fields.
2D plots
With gnuplot, I used to run stuff like
plot ‘8000/points.dat’ u 1:2
for a 2D plot of a scalar field. On column 1 I have the x values of the coordinates and on column 2 the y values, so this just plots the coordinates. The “8000” is the directory for time step 8000, where the data file is saved.
OK, now running ipython –pylab I have to run
dt = pylab.loadtxt(‘8000/points.dat’)
ss=scatter(dt[:,0],dt[:,1],c=dt[:,11],s=50)
Important things to notice:
- python starts numbering c-style: at 0! so, despite pylab having been designed in order to mimic matlab syntax, there is a clear departure here.
- it’s easy to assign a color to the points, in this case column 12 (11 for python) is a density field. The default color scale looks ok (it goes from blue to red).
- the size is set to 50 for a nice full-screen view.
- New plots will appear on top of this one. If this is not desired, close the window, or run pylab.clf()
Vector plots
This is quite easy in gnuplot:
plot ‘8000/points.dat’ u 1:2:($5/10):($6/10) w vec
On columns 5 and 6 I store the x and y components of the velocity. In this example they are reduced ten-fold in order to hace a decent plot (and this has to set by hand…).
Now we may run:
st=quiver(dt[:,0],dt[:,1],dt[:,4],dt[:,5],dt[11])
which does the same. A bonus is that the vector length is automatically calculated from the average vector length. This may the right solution, if not the option “scale=xx” may be used. The higher xx is, the shorter the arrows (??). The fifth entry is a color code, which does not look to good at present because, I think, they are taken as RGB values, unlike with scatter.
3D plots
This one’s harder. To get a scatter 3D plot of three columns I used to run
splot ‘8000/points.dat’ u 1:2:12
Now, it’s more like
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection=’3d’)
ax.scatter(dt[:,0],dt[:,1],dt[:,11])
fig.show()
That produces a quite nice scatter plot with tick marks on the three axes.