Goods
Goods

Reputation: 225

3d plot from two vectors and an array

I have two vectors that store my X, Y values than are lengths 81, 105 and then a (81,105) array (actually a list of lists) that stores my Z values for those X, Y. What would be the best way to plot this in 3d? This is what i've tried:

Z = np.load('Z.npy')
X = np.load('X.npy')
Y = np.linspace(0, 5, 105)
fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap= 'viridis')
plt.show() 

I get the following error : ValueError: shape mismatch: objects cannot be broadcast to a single shape

Upvotes: 0

Views: 75

Answers (1)

Wenlong Liu
Wenlong Liu

Reputation: 444

OK, I got it running. There is some tricks here. I will mention them in the codes.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from random import shuffle

# produce some data.
x = np.linspace(0,1,81)
y = np.linspace(0,1,105)
z = [[i for i in range(81)] for x in range(105)]
array_z = np.array(z)

# Make them randomized.
shuffle(x)
shuffle(y)
shuffle(z)

# Match data in x and y.
data = []
for i in range(len(x)):
    for j in range(len(y)):
        data.append([x[i], y[j], array_z[j][i]])
        # Be careful how you data is stored in your Z array. 
# Stored in dataframe   
results = pd.DataFrame(data, columns = ['x','y','z'])

# Plot the data.    
fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(results.x, results.y, results.z, cmap= 'viridis')

enter image description here

The picture looks weird because I produced some data. Hope it helps.

Upvotes: 1

Related Questions