Reputation: 47
I have a 2d matrix of values which I would like to plot as a 2d histogram.
A simplified example:
I have a 1d array of initial velocities, say vi = [1, 2, 3]
, and for each value in vi
, I have a row of corresponding final velocities stored in a 2d array, vf = [ [0.7, 1.1, 1.5], [1.8, 2.1, 2.4], [2.7, 2.9, 3.1] ]
.
I want to be able to make a 2d histogram of the points (vi, vf)
, i.e., the coordinates [1, 0.7], [1, 1.1], [1, 1.5], [2, 1.8], [2, 2.1], [2, 2.4], and [3,2.7], [3, 2.9], [3, 3.1]
.
Is there a way to create such parings?
The answer to this question advises to use imshow or matshow, but that colors bins by the value assigned to each element. What I need is a plotting routine that takes a 2d matrix, divides it into a grid, and colors each bin by the count in each bin.
Any help is appreciated!
Upvotes: 0
Views: 960
Reputation: 80329
You seem to have a 2D space, where the x-values come from vi
and the y-values from vf
. Repeating vi
n
times (with n
the row-length of vf
) makes the x
and y
arrays have the same number of elements, corresponding to the desired tuples.
In code:
import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt
vi = np.array([1, 2, 3])
vf = np.array([[0.7, 1.1, 1.5], [1.8, 2.1, 2.4], [2.7, 2.9, 3.1]])
x = np.repeat(vi, vf.shape[1]) # repeat the x-values by the row-length of `vf`
y = vf.ravel() # convert to a 1D array
sns.histplot(x=x, y=y)
plt.show()
With so little data, the plot looks quite uninteresting. You'll have to test with the real data to find out whether it is what you're expecting.
print([*zip(x,y)])
prints (x,y)
as tuples, i.e.
[(1, 0.7), (1, 1.1), (1, 1.5), (2, 1.8), (2, 2.1), (2, 2.4), (3, 2.7), (3, 2.9), (3, 3.1)]
Upvotes: 1