I want to generate a heatcube. The axis are specific values for 3 different parameters and the actual value of a point (x,y,z) is a goodness of fit value. That means (x,y,z) should be read as categorical variables. However, I struggle to get the axis on the right scale so that it only considers the given values to be plotted and not a continuum of points
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
lam = [0.000001, 0.00001, 0.0001, 0.001, 0.01, 1, 10]
alpha = [0.0001, 0.001, 0.01, 0.02, 0.03, 0.04, 0.05, 0.1, 0.2]
delta = [0, 0.000001, 0.00001, 0.0001, 0.001, 0.01, 1, 10]
X, Y, Z = np.meshgrid(lam, alpha, delta)
c = np.random.randn(len(lam), len(alpha), len(delta))
ax.scatter(X,Y,Z, c=c,cmap="brg")
plt.show()
which gives a misleading picture:
As one can see the plot has by far too large spaces on the different axis. I would like to have only points shown the actual values of lam, alpha, delta like in this plot
Better solution (maybe thats what you wanted after all) is to make meshgrid of indices and substitute labels of ticks:
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
lam = [0.000001, 0.00001, 0.0001, 0.001, 0.01, 1, 10]
alpha = [0.0001, 0.001, 0.01, 0.02, 0.03, 0.04, 0.05, 0.1, 0.2]
delta = [0, 0.000001, 0.00001, 0.0001, 0.001, 0.01, 1, 10]
# X, Y, Z = np.meshgrid(lam, alpha, delta)
X, Y, Z = np.meshgrid(np.arange(len(lam)), np.arange(len(alpha)), np.arange(len(delta)))
c = np.random.randn(len(lam), len(alpha), len(delta))
ax.scatter(X, Y, Z, c=c, cmap="brg",)
ax.set_xticklabels(lam)
ax.set_yticklabels(alpha)
ax.set_zticklabels(delta)
plt.show()



