6

I am trying to create a 3D surface with transparency. When I try the following code below, I expect to get two semi-transparent faces of a cube. However, both the faces are opaque inspite of supplying the alpha=0.5 argument. Any pointer on why this is happening and how to fix it ? I am using Python 3.3 (IPython notebook with the QT backend)and Matplotlib 1.3.1.

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import mpl_toolkits.mplot3d as mp3d

bot = [(0, 0, 0),
       (1, 0, 0),
       (1, 1, 0),
       (0, 1, 0),
       ]

top = [(0, 0, 1),
       (1, 0, 1),
       (1, 1, 1),
       (0, 1, 1),
       ]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
face1 = mp3d.art3d.Poly3DCollection([bot], alpha=0.5, linewidth=1)
face2 = mp3d.art3d.Poly3DCollection([top], alpha=0.5, linewidth=1)

ax.add_collection3d(face1)
ax.add_collection3d(face2)
Karthik V
  • 1,867
  • 1
  • 16
  • 23
  • 1
    This is a bug: https://github.com/matplotlib/matplotlib/issues/1541 There also is a similar SO question: http://stackoverflow.com/questions/18897786/transparency-for-poly3dcollection-plot-in-matplotlib – David Zwicker May 01 '14 at 09:15
  • @DavidZwicker Thank you. Based on the bug description, I was able to set the transparency by setting the color and alpha as a 4-tuple for each face. – Karthik V May 01 '14 at 15:10

1 Answers1

10

Based on David Zwicker's input, I was able to get transparency working by setting the facecolor directly as a 4-tuple with alpha.

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import mpl_toolkits.mplot3d as mp3d

bot = [(0, 0, 0),
       (1, 0, 0),
       (1, 1, 0),
       (0, 1, 0),
       ]

top = [(0, 0, 1),
       (1, 0, 1),
       (1, 1, 1),
       (0, 1, 1),
       ]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
face1 = mp3d.art3d.Poly3DCollection([bot], alpha=0.5, linewidth=1)
face2 = mp3d.art3d.Poly3DCollection([top], alpha=0.5, linewidth=1)

# This is the key step to get transparency working
alpha = 0.5
face1.set_facecolor((0, 0, 1, alpha))
face2.set_facecolor((0, 0, 1, alpha))

ax.add_collection3d(face1)
ax.add_collection3d(face2)

Transparency by setting face color directly

Karthik V
  • 1,867
  • 1
  • 16
  • 23
  • Does the alpha value actually do anything for you? I do get transparency as shown in your answer but it stays at the same level irrespective of `alpha` – Bananach Jun 27 '18 at 18:08