J_Castro
3 years agoFrequent Visitor
Status:
Needs Info
Python visual on the Service doesn't render as in PBI Desktop
The error message I get on the Service is: "It is not currently possible to manually set the aspect on 3D axes" But it rendered normally on Desktop (see below). The method causing the issue is se...
J_Castro
3 years agoFrequent Visitor
Hello Alisa
Anonymous
That's the first time I use a Python visual in a professional setting.
Currently, I am pulling data from an Excel file.
PBI Desktop version: 2.121.942.0 64-bit (September 2023)
Please see below that if I comment the lines regarding axis formatting, it works.
Please find the viz code below:
# The following code to create a dataframe and remove duplicated rows is always executed and acts as a preamble for your script:
# dataset = pandas.DataFrame(Diam (IN), X, Y, Z, Width (IN), Railcar)
# dataset = dataset.drop_duplicates()
# Paste or type your script code here:
df = dataset
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.path import Path
import numpy as np
def plot_cylinder(x, y, z, r, h):
if y == 0:
y = r
elif y > 0:
y = y + r + 5
#color the cylinder
if z == 82:
cylinder_color = 'brown'
elif z == 68:
cylinder_color = 'gray'
elif z == 70:
cylinder_color = 'blue'
elif z == 80:
cylinder_color = 'yellow'
elif z == 82:
cylinder_color = 'purple'
elif z == 85:
cylinder_color = 'yellow'
elif z == 90:
cylinder_color = 'red'
elif z == 102:
cylinder_color = 'green'
def data_for_cylinder_along_z(center_x,center_y,radius,height_z):
z = np.linspace(0, height_z, 50)
theta = np.linspace(0, 2*np.pi, 50)
theta_grid, z_grid=np.meshgrid(theta, z + h)
x_grid = radius*np.cos(theta_grid) + center_x
y_grid = radius*np.sin(theta_grid) + center_y
return x_grid,y_grid,z_grid
Xc,Yc,Zc = data_for_cylinder_along_z(x+r, y, r, z)
ax.plot_surface(Xc,Yc,Zc,
alpha=0.95,
color= cylinder_color,
#cmap='Set1',
rstride=3,
cstride=3
)
fig = plt.figure(figsize=(7,4))
ax = Axes3D(fig)
fig.add_axes(ax)
#ax.set_xlim3d(0, 600)
#ax.set_ylim3d(0, 108)
#ax.set_zlim3d(0, 154)
#ax.set_zticks(np.arange(0, 154, step=10))
#ax.zaxis.set_tick_params(labelsize=5)
#ax.set_yticks(np.arange(0, 108, step=25))
#ax.yaxis.set_tick_params(labelsize=5)
#ax.set_xticks(np.arange(0, 600, step=25))
#ax.xaxis.set_tick_params(labelsize=5)
#ax.set_aspect('equal', adjustable='box')
for i, row in df.iterrows():
plot_cylinder(
int(row['X']),
int(row['Z']),
int(row['Width (IN)']),
int(row['Diam (IN)']) / 2,
int(row['Y'])
)
ax.view_init(30, 40)
plt.show()