Example O2: Including data plots in rendered images¶
This user-defined viewport overlay function demonstrates how to use the Matplotlib Python module to render the radial
distribution function, which is dynamically computed by a CoordinationAnalysisModifier
in the data pipeline, on top the three-dimensional visualization.
import matplotlib
matplotlib.use('Agg') # Activate 'agg' backend for off-screen plotting.
import matplotlib.pyplot as plt
import PySide2.QtGui
def render(args):
# Request the results of the pipeline at the animation time currently being rendered:
data = args.scene.selected_pipeline.compute(args.frame)
# Look up the DataTable generated by the CoordinationAnalysisModifier:
if 'coordination-rdf' not in data.tables:
raise RuntimeError('No RDF data found')
rdf_data = data.tables['coordination-rdf'].xy()
# Compute plot size in inches (DPI determines label size)
dpi = 80
plot_width = 0.5 * args.size[0] / dpi
plot_height = 0.5 * args.size[1] / dpi
# Create matplotlib figure:
fig, ax = plt.subplots(figsize=(plot_width,plot_height), dpi=dpi)
fig.patch.set_alpha(0.5)
plt.title('Coordination')
# Plot RDF histogram data
ax.bar(rdf_data[:,0], rdf_data[:,1])
plt.tight_layout()
# Render figure to an in-memory buffer.
buf = fig.canvas.print_to_buffer()
plt.close(fig)
# Create a QImage from the memory buffer
res_x, res_y = buf[1]
img = PySide2.QtGui.QImage(buf[0], res_x, res_y, PySide2.QtGui.QImage.Format_RGBA8888)
# Paint QImage onto viewport canvas
args.painter.drawImage(0, 0, img)