Python - How To Make A 4d Plot With Matplotlib Using Arbitrary Data - Stack Overflow
Python - How To Make A 4d Plot With Matplotlib Using Arbitrary Data - Stack Overflow
People who code: we want your input. Take the Survey
25 What I would like to know is how to apply the suggested solution to a bunch of data (4 columns),
e.g.:
# Python-matplotlib Commands
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, .25)
Y = np.arange(-5, 5, .25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
Gx, Gy = np.gradient(Z) # gradients with respect to x and y
G = (Gx**2+Gy**2)**.5 # gradient magnitude
N = G/G.max() # normalize 0..1
surf = ax.plot_surface(
X, Y, Z, rstride=1, cstride=1,
facecolors=cm.jet(N),
linewidth=0, antialiased=False, shade=False)
plt.show()
As far as I can see, and this applies to all matplotlib-demos, the variables X, Y and Z are nicely
prepared. In practical cases this is not always the case.
python matplotlib
Share Improve this question Follow edited May 23 '17 at 10:30 asked Feb 21 '13 at 6:03
Community ♦ Tengis
1 1 2,339 10 29 50
is it reading X and Y from the columns that you're having trouble with? – aaren Feb 21 '13 at 12:03
No, but the fact that (X;Y;Z) are not on a grid like the example. – Tengis Feb 21 '13 at 13:00
Join Stack Overflow to learn, share knowledge, and build your career. Sign up
https://stackoverflow.com/questions/14995610/how-to-make-a-4d-plot-with-matplotlib-using-arbitrary-data 3/13
6/5/2021 python - How to make a 4d plot with matplotlib using arbitrary data - Stack Overflow
Great question Tengis, all the math folks love to show off the flashy surface plots with functions
given, while leaving out dealing with real world data. The sample code you provided uses
48 gradients since the relationships of a variables are modeled using functions. For this example I will
generate random data using a standard normal distribution.
Anyways here is how you can quickly plot 4D random (arbitrary) data with first three variables are
on the axis and the fourth being color:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = np.random.standard_normal(100)
y = np.random.standard_normal(100)
z = np.random.standard_normal(100)
c = np.random.standard_normal(100)
Note: A heatmap with the hot color scheme (yellow to red) was used for the 4th dimension
Result:
Join Stack Overflow to learn, share knowledge, and build your career. Sign up
https://stackoverflow.com/questions/14995610/how-to-make-a-4d-plot-with-matplotlib-using-arbitrary-data 4/13
6/5/2021 python - How to make a 4d plot with matplotlib using arbitrary data - Stack Overflow
]1
Share Improve this answer Follow edited Apr 10 '19 at 13:15 answered Jul 22 '15 at 23:21
mrandrewandrade
1,810 15 20
1 Great answer! How would one attach a colorbar as a scale for the heatmap? I am having difficulties with the
code. – Cyclopropane Sep 16 '18 at 5:23
Hi, this is a great solution for the type of graph I am aiming for. One question I have is really if it works with
large datasets? Mine is 3mil + rows. – Jo Costa Feb 13 '19 at 12:48
@DrPepper I edited the answer with an example. You need to use colorbar to do this. – mrandrewandrade
Apr 10 '19 at 13:17
@JoCosta Yes no problem so long as it can fit in memory. How large is your dataset and how much ram do
you have? Pandas requires up to 10x the size of the dataset in Ram – mrandrewandrade Apr 10 '19 at 13:17
I know that the question is very old, but I would like to present this alternative where, instead of
using the "scatter plot", we have a 3D surface diagram where the colors are based on the 4th
11 dimension. Personally I don't really see the spatial relation in the case of the "scatter plot" and so
using 3D surface help me to more easily understand the graphic.
Join Stack Overflow to learn, share knowledge, and build your career. Sign up
The main idea is the same than the accepted answer but we have a 3D graph of the surface that
https://stackoverflow.com/questions/14995610/how-to-make-a-4d-plot-with-matplotlib-using-arbitrary-data 5/13
6/5/2021 python - How to make a 4d plot with matplotlib using arbitrary data - Stack Overflow
The main idea is the same than the accepted answer, but we have a 3D graph of the surface that
allows to visually better see the distance between the points. The following code here is mainly
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import matplotlib.tri as mtri
if do_random_pt_example:
number_of_points = 200;
x = np.random.rand(number_of_points);
y = np.random.rand(number_of_points);
z = np.random.rand(number_of_points);
c = np.random.rand(number_of_points);
else:
# Example where we have a "Pandas Dataframe" where each line = 1 pt in 4D.
# We assume here that the "data frame" "df" has already been loaded before.
x = df[list_name_variables[index_x]];
y = df[list_name_variables[index_y]];
z = df[list_name_variables[index_z]];
c = df[list_name_variables[index_c]];
#end
#-----
# We create triangles that join 3 pt at a time and where their colors will be
# determined by the values of their 4th dimension. Each triangle contains 3
# indexes corresponding to the line number of the points to be grouped.
# Therefore, different methods can be used to define the value that
# will represent the 3 grouped points and I put some examples.
triangles = mtri.Triangulation(x, y).triangles;
choice_calcuation_colors = 1;
if choice_calcuation_colors == 1: # Mean of the "c" values of the 3 pt of the
triangle
colors = np.mean( [c[triangles[:,0]], c[triangles[:,1]],
c[triangles[:,2]]], axis = 0);
elif choice_calcuation_colors == 2: # Mediane of the "c" values of the 3 pt of
the triangle
colors = np.median( [c[triangles[:,0]], c[triangles[:,1]],
c[triangles[:,2]]], axis = 0);
elif choice_calcuation_colors == 3: # Max of the "c" values of the 3 pt of the
triangle
colors = np.max( [c[triangles[:,0]], c[triangles[:,1]], c[triangles[:,2]]],
axis = 0);
#end
#----------
# Displays the 4D graphic.
fig = plt.figure();
ax = fig.gca(projection='3d');
triang = mtri.Triangulation(x, y, triangles);
surf = ax.plot_trisurf(triang, z, cmap = name_color_map, shade=False,
Join Stack Overflow
linewidth= to);learn, share knowledge, and build your career.
0.2 Sign up
surf.set_array(colors); surf.autoscale();
https://stackoverflow.com/questions/14995610/how-to-make-a-4d-plot-with-matplotlib-using-arbitrary-data 6/13
6/5/2021 python - How to make a 4d plot with matplotlib using arbitrary data - Stack Overflow
#Add a color bar with a title to explain which variable is represented by the
color.
cbar = fig.colorbar(surf, shrink=0.5, aspect=5);
cbar.ax.get_yaxis().labelpad = 15;
cbar.ax.set_ylabel(list_name_variables[index_c], rotation = 270);
plt.show();
Another solution for the case where we absolutely want to have the original values of the 4th
dimension for each point is simply to use the "scatter plot" combined with a 3D surface diagram
that will simply link them to help you see the distances between them.
fig = plt.figure();
ax = fig.add_subplot(111, projection='3d');
ax.set_xlabel(list_name_variables[index_x]);
Join Stack Overflow to learn, share knowledge, and build your career.
ax.set_ylabel(list_name_variables[index_y]); Sign up
ax.set_zlabel(list_name_variables[index_z]);
plt title('%s in fcn of %s %s and %s' % (list name variables[index c]
https://stackoverflow.com/questions/14995610/how-to-make-a-4d-plot-with-matplotlib-using-arbitrary-data 7/13
6/5/2021 python - How to make a 4d plot with matplotlib using arbitrary data - Stack Overflow
plt.title( %s in fcn of %s, %s and %s % (list_name_variables[index_c],
list_name_variables[index_x], list_name_variables[index_y],
list_name_variables[index_z]) );
# In this case, we will have 2 color bars: one for the surface and another for
# the "scatter plot".
# For example, we can place the second color bar under or to the left of the
figure.
choice_pos_colorbar = 2;
# The 3D surface that serves only to connect the points to help visualize
# the distances that separates them.
# The "alpha" is used to have some transparency in the surface.
surf = ax.plot_trisurf(x, y, z, cmap = name_color_map_surface, linewidth = 0.2,
alpha = 0.25);
# The second color bar will be placed at the left of the figure.
if choice_pos_colorbar == 1:
#I am trying here to have the two color bars with the same size even if it
#is currently set manually.
cbaxes = fig.add_axes([1-0.78375-0.1, 0.3025, 0.0393823, 0.385]); # Case
without tigh layout.
#cbaxes = fig.add_axes([1-0.844805-0.1, 0.25942, 0.0492187, 0.481161]); #
Case with tigh layout.
Join Stack Overflow to learn, share knowledge, and build your career. Sign up
https://stackoverflow.com/questions/14995610/how-to-make-a-4d-plot-with-matplotlib-using-arbitrary-data 8/13
6/5/2021 python - How to make a 4d plot with matplotlib using arbitrary data - Stack Overflow
Finally, it is also possible to use "plot_surface" where we define the color that will be used for each
face. In a case like this where we have 1 vector of values per dimension, the problem is that we
have to interpolate the values to get 2D grids. In the case of interpolation of the 4th dimension, it
will be defined only according to X-Y and Z will not be taken into account. As a result, the colors
represent C (x, y) instead of C (x, y, z). The following code is mainly based on the following
responses: plot_surface with a 1D vector for each dimension; plot_surface with a selected color for
each surface. Note that the calculation is quite heavy compared to previous solutions and the
display may take a little time.
import matplotlib
from scipy.interpolate import griddata
#--------
color_dimension = c2; # It must be in 2D - as for "X, Y, Z".
minn, maxx = color_dimension.min(), color_dimension.max();
norm = matplotlib.colors.Normalize(minn, maxx);
m = plt.cm.ScalarMappable(norm=norm, cmap = name_color_map);
m.set_array([]);
fcolors = m.to_rgba(color_dimension);
Join Stack Overflow to learn, share knowledge, and build your career. Sign up
Share Improve this answer Follow edited Aug 24 '19 at 14:53 answered Aug 24 '19 at 14:30
https://stackoverflow.com/questions/14995610/how-to-make-a-4d-plot-with-matplotlib-using-arbitrary-data 10/13
6/5/2021 python - How to make a 4d plot with matplotlib using arbitrary data - Stack Overflow
p edited Aug 24 19 at 14:53 answered Aug 24 19 at 14:30
Vincent Rougeau-Moss
178 1 3 10
Hi Vincent, could you please take a look at this question and see if you could kindly answer it too? Many
thanks! – Pygin May 8 at 17:31
I would like to add my two cents. Given a three-dimensional matrix where every entry represents
a certain quantity, we can create a pseudo four-dimensional plot using Numpy's
2 unravel_index() function in combination with Matplotlib's scatter() method.
import numpy as np
import matplotlib.pyplot as plt
def plot4d(data):
fig = plt.figure(figsize=(5, 5))
ax = fig.add_subplot(projection="3d")
ax.xaxis.pane.fill = False
ax.yaxis.pane.fill = False
ax.zaxis.pane.fill = False
mask = data > 0.01
idx = np.arange(int(np.prod(data.shape)))
x, y, z = np.unravel_index(idx, data.shape)
ax.scatter(x, y, z, c=data.flatten(), s=10.0 * mask, edgecolor="face",
alpha=0.2, marker="o", cmap="magma", linewidth=0)
plt.tight_layout()
plt.savefig("test_scatter_4d.png", dpi=250)
plt.close(fig)
if __name__ == "__main__":
X = np.arange(-10, 10, 0.5)
Y = np.arange(-10, 10, 0.5)
Z = np.arange(-10, 10, 0.5)
X, Y, Z = np.meshgrid(X, Y, Z, indexing="ij")
density_matrix = np.sin(np.sqrt(X**2 + Y**2 + Z**2))
plot4d(density_matrix)
Join Stack Overflow to learn, share knowledge, and build your career. Sign up
https://stackoverflow.com/questions/14995610/how-to-make-a-4d-plot-with-matplotlib-using-arbitrary-data 11/13
6/5/2021 python - How to make a 4d plot with matplotlib using arbitrary data - Stack Overflow
This is an amazing solution. I wish this was part of matplotlib. – jvdillon May 18 at 19:16
One possibility would be use a color space, for example RGBA or HSVA, they are 4 dimensional,
but displaying the alpha (transparency) well may be a problem.
0
Other possibility would be a dynamic plot with a slider. One of the dimensions would be
Join Stack Overflow to learn, share knowledge, and build your career. Sign up
represented by the slider.
https://stackoverflow.com/questions/14995610/how-to-make-a-4d-plot-with-matplotlib-using-arbitrary-data 12/13
6/5/2021 python - How to make a 4d plot with matplotlib using arbitrary data - Stack Overflow
Join Stack Overflow to learn, share knowledge, and build your career. Sign up
https://stackoverflow.com/questions/14995610/how-to-make-a-4d-plot-with-matplotlib-using-arbitrary-data 13/13