4

I'm generating a 3D surface using MatPlotLib's plot_surface method, then saving it to a PDF file. I am able to hide the surface lines via "linewidth=0", but the lines appear again after a savefig to PDF.

Edit: When doing the savefig() to .png and .svg, the hidden lines stay hidden.

The first image below is a screenshot of the plt.show() result, and the second is a screenshot of the PDF result. Any ideas of what I can do to keep the hidden lines out of sight in the PDF?

I'll post code at the bottom, since it's a bit long. Windows 7 (64-bit), Python 2.7.3 (win32), MatPlotLib 1.2.0 (win32).

Change of plan, this forum doesn't allow me to post images, something about not having a reputation :). So code only.

#=====================================================================

# get external packages
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#=====================================================================

Gw1 = plt.figure("Sphere-Cylinder Intersection")
diagram1 = Axes3D(Gw1)
diagram1.view_init(33,-48)

# force equal aspect ratio in all 3 directions
# 3D library is missing this -- force it with an invisible bounding cube
diagram1.set_aspect('equal')
CUBE = 1.3
for direction in (-1, 1):
    for point in np.diag(direction * CUBE * np.array([1,1,1])):
        diagram1.plot([point[0]], [point[1]], [point[2]], 'white')

# line for y-axis (show as N/E/D coords, not plotting coords)
diagram1.plot([0.0,1.5],[0.0,0.0],[0.0,0.0],
              linewidth=1,linestyle='-',color='black')
diagram1.text(1.6,0.0,0.0,'y',fontsize=14,fontweight='bold')

# line for x-axis (show as N/E/D coords, not plotting coords)
diagram1.plot([0.0,0.0],[0.0,1.5],[0.0,0.0],
              linewidth=1,linestyle='-',color='black')
diagram1.text(0.0,1.6,0.0,'x',fontsize=14,fontweight='bold')

# line for z-axis (show as N/E/D coords, not plotting coords)
diagram1.plot([0.0,0.0],[0.0,0.0],[0.0,-1.5],
              linewidth=1,linestyle='-',color='black')
diagram1.text(0.0,0.0,-1.7,'z',fontsize=14,fontweight='bold')

# unit sphere about origin
phi = np.linspace(0.0,np.pi/2.0,361)
theta = np.linspace(0.0,np.pi,361)
phi,theta = np.meshgrid(phi,theta)
x = np.sin(theta)*np.cos(phi)
y = np.sin(theta)*np.sin(phi)
z = np.cos(theta)
diagram1.plot_surface(x,y,z,linewidth=0.0,color='DarkKhaki',alpha=0.25)

# elliptical cylinder about z-axis 1
a = 0.10
b = 0.15
x = a*np.cos(np.linspace(0.0,np.pi/2.0,101))
z = np.linspace(-1.3,1.3,101)
x,z = np.meshgrid(x,z)
y = b*np.sin(np.arccos(x/a))
diagram1.plot_surface(x,y,z,linewidth=0.0,color='red',alpha=0.25)

# elliptical cylinder about z-axis 2
a = 0.21
b = 0.315
x = a*np.cos(np.linspace(0.0,np.pi/2.0,101))
z = np.linspace(-1.3,1.3,101)
x,z = np.meshgrid(x,z)
y = b*np.sin(np.arccos(x/a))
diagram1.plot_surface(x,y,z,linewidth=0.0,color='red',alpha=0.25)

# elliptical cylinder about z-axis 3
a = 0.42
b = 0.63
x = a*np.cos(np.linspace(0.0,np.pi/2.0,101))
z = np.linspace(-1.3,1.3,101)
x,z = np.meshgrid(x,z)
y = b*np.sin(np.arccos(x/a))
diagram1.plot_surface(x,y,z,linewidth=0.0,color='red',alpha=0.25)

# sphere-cylinder intersection 1
a = 0.10
b = 0.15
x = a*np.cos(np.linspace(0.0,np.pi/2.0,101))
y = b*np.sin(np.linspace(0.0,np.pi/2.0,101))
z = np.sqrt(np.around(1.0-x**2-y**2,decimals=10))
diagram1.plot(x,y,z,linewidth=1.0,linestyle='-',color='red')
diagram1.plot(x,y,-z,linewidth=1.0,linestyle='-',color='red')

# sphere-cylinder intersection 2
a = 0.21
b = 0.315
x = a*np.cos(np.linspace(0.0,np.pi/2.0,101))
y = b*np.sin(np.linspace(0.0,np.pi/2.0,101))
z = np.sqrt(np.around(1.0-x**2-y**2,decimals=10))
diagram1.plot(x,y,z,linewidth=1.0,linestyle='-',color='red')
diagram1.plot(x,y,-z,linewidth=1.0,linestyle='-',color='red')

# sphere-cylinder intersection 3
a = 0.42
b = 0.63
x = a*np.cos(np.linspace(0.0,np.pi/2.0,101))
y = b*np.sin(np.linspace(0.0,np.pi/2.0,101))
z = np.sqrt(np.around(1.0-x**2-y**2,decimals=10))
diagram1.plot(x,y,z,linewidth=1.0,linestyle='-',color='red')
diagram1.plot(x,y,-z,linewidth=1.0,linestyle='-',color='red')

# plotting axes off
diagram1.axis('off')

# display/save
plt.savefig ("Diagram1.pdf")
plt.show()

#=====================================================================
J Boyd
  • 56
  • 5
  • I should have mentioned ... when doing the savefig() to .png and .svg the hidden lines stay hidden. There is a white trace of them, but this is not a problem for my purposes. Unfortunately .png format is not scalable and .svg isn't a well-covered format yet in terms of import/export in other applications. – J Boyd Jul 20 '13 at 21:44
  • You should update (edit) your question to include this information, rather than posting it in a comment. Also, if you include links to the images, someone with enough reputation can upload them for you. – sodd Jul 21 '13 at 08:21
  • You might file a bug report at matplotlib's github issue page if the problem is only with PDF output. – esmit Jul 22 '13 at 17:21
  • nordev - I've just edited, thanks. – J Boyd Jul 23 '13 at 15:29
  • esmit - That seems likely; I'll post a bug report. – J Boyd Jul 23 '13 at 15:31
  • you can convert the .svg output to .pdf using inkscape: `inkscape -f input.svg -export-pdf-version=1.4 --export-pdf=output.pdf`. Unfortunately, the answer from [White lines in matplotlib's pcolor](https://stackoverflow.com/questions/27092991/white-lines-in-matplotlibs-pcolor) does not work for `plot_surface` for reasons only the developers know. – mxmlnkn Apr 12 '18 at 18:26

1 Answers1

0

As suggested by esmit, the fact that the output appears to be correct in other image formats (both PNG and SVG) suggests there may be a bug in the PDF backend. I'll post a bug report at github.

Thanks for the tips!

J Boyd
  • 56
  • 5