Skip to content

Examples

This page provides 9 examples of how to use the features of chemdiagrams.

Example 1: Merging plateaus, x-axis breaks and images in plot

from chemdiagrams import EnergyDiagram
import os.path

penguin = os.path.join("figures", "penguin.png")
penguin_TS = os.path.join("figures", "penguin_TS.png")
penguin_II = os.path.join("figures", "penguin_2.png")
untitled = os.path.join("figures", "untitled.jpeg")

dia = EnergyDiagram(
    style="twosided",
    extra_y_margin=(0, 0.25),
)

dia.draw_path(
    [0,1,2], [-32, 18, 0], "blue",
    path_name="Blue path",   
)

dia.draw_path(
    [2,3,4], [0, 25, -42], "red",
    path_name="Red path",
)

dia.draw_difference_bar(
    2, (-32, -42),
    r"$\Delta E_\mathrm{R}$: ",
    left_side=True,
    x_whiskers=(0,4),
    whiskercolor="red"
)
dia.bars[0].whisker_1.set_color("blue")

dia.add_image_series_in_plot(
    [penguin_II, penguin_TS, penguin, penguin_TS, penguin_II],
    y_placement="top",
    y_offsets=2
)

dia.add_numbers_average(color="black")
dia.merge_plateaus(2, "Blue path", "Red path")
dia.add_xaxis_break(2)
dia.set_xlabels(["P1", "TS1", "E", "TS2", "P2"])
dia.ax.set_ylabel(r"$\Delta E$ in kJ mol$^{-1}$", fontsize=8)
dia.legend(fontsize=5)
dia.ax.set_title("Penguin Reaction", fontsize=10)

dia.fig.savefig(os.path.join("..", "docs", "img", "title", "image_1.png"), dpi=300, bbox_inches="tight")
dia.show()

Diagram 1

Example 2: Multiple paths

from chemdiagrams import EnergyDiagram
import os.path

dia = EnergyDiagram()

dia.draw_path(
    [0,1,2,3,4], [0, 32, 5, 25, -15], "blue",
    path_name="Blue path",
    linetypes=2
)

dia.draw_path(
    [0,1,2,3,4], [0, 26, 6, 15, -18], "red",
    path_name="Red path",
    linetypes=2
)

dia.draw_path(
    [0,1,4], [0, 12, -32], "green",
    path_name="Green path",
    linetypes=[2,1]
)

dia.draw_path(
    [0,1,2,3,4], [0, 20, 8, 12, -20], "orange",
    path_name="Orange path",
    linetypes=2
)


dia.add_numbers_auto()

dia.legend(fontsize=5)
dia.set_xlabels(["Educt", "Transition\nState 1", "Intermediate", "Transition\nState 2", "Product"], weight="normal", fontsize=6)
dia.ax.set_ylabel(r"$\Delta E$ in kJ mol$^{-1}$", fontsize=8)

dia.fig.savefig(os.path.join("..", "docs", "img", "title", "image_2.png"), dpi=300, bbox_inches="tight")
dia.show()
Diagram 2

Example 3: Customization of one state

from chemdiagrams import EnergyDiagram
import os.path

dia = EnergyDiagram(style="boxed")

dia.draw_path(
    [0,1,2,3,4], [0, 32, 5, 25, -15], "blue",
    path_name="Blue path",
    linetypes=[1,1,1,-1]
)
dia.add_path_labels("Blue path", [None, None, "Important\nIntermediate", None, None], color="red", fontsize=6)

dia.add_numbers_auto()
dia.lines["Blue path"].plateaus["2.0"].set_color("red")
dia.numbers["Blue path"]["2.0"].set_color("red")

dia.draw_difference_bar(
    1, 
    (0, 5), 
    r"$\Delta E_\mathrm{R,1}$", 
    left_side=True, 
    x_whiskers=(0,2), 
    whiskercolor="blue", 
    add_difference=False
)
dia.bars[0].whisker_2.set_color("red")

dia.draw_difference_bar(
    3, 
    (5, -15), 
    r"$\Delta E_\mathrm{R,2}$", 
    left_side=True, 
    x_whiskers=(2,4), 
    whiskercolor="blue", 
    add_difference=False
)
dia.bars[1].whisker_1.set_color("red")


dia.set_xlabels(["E", "TS1", "I", "TS2", "P"])
dia.ax.set_ylabel(r"$\Delta E$ in kJ mol$^{-1}$", fontsize=8)

dia.fig.savefig(os.path.join("..", "docs", "img", "title", "image_3.png"), dpi=300, bbox_inches="tight")
dia.show()
Diagram 3

Example 4: Images in plot

from chemdiagrams import EnergyDiagram
import os.path

ester_1 = os.path.join("figures", "ester_1.png")
ester_2 = os.path.join("figures", "ester_2.png")
ester_3 = os.path.join("figures", "ester_3.png")
ester_4 = os.path.join("figures", "ester_4.png")
ester_5 = os.path.join("figures", "ester_5.png")

dia = EnergyDiagram(
    style="borderless",
    extra_y_margin=(0, 0.25),
)

dia.draw_path(
    [0,1,2,3,4], [0, 32, 5, 25, -15], "blue",
    path_name="Blue path",
    linetypes=3   
)

dia.add_numbers_average(color="black")
dia.set_xlabels(["Ester", "TS1", "Hemiacetal", "TS2", "Carboxylic\nAcid"], in_plot=True, fontsize=6, weight="normal")

dia.add_image_series_in_plot(
    [ester_1, ester_2, ester_3, ester_4, ester_5],
    y_placement="top",
    width=[0.6, 0.7, 0.6, 0.7, 0.6],
    y_offsets=1.5,
    framed=[True, False, False, False, True],
    frame_colors="blue"
)

dia.ax.set_title("Ester hydrolysis", fontsize=10)
dia.fig.savefig(os.path.join("..", "docs", "img", "title", "image_4.png"), dpi=300, bbox_inches="tight")
dia.fig.savefig(os.path.join("..","docs","img","example_image_series.png"),format="png", bbox_inches="tight")
dia.show()
Diagram 4

Example 5: Path labels

from chemdiagrams import EnergyDiagram
import os.path

dia = EnergyDiagram()

dia.draw_path(
    [0,1,2,3], [0, 18, 12, 26], "blue",
    path_name="Blue path",
    linetypes=[4,4,3]
)

dia.add_path_labels("Blue path", [None, "TS", "P", "P2"])

dia.draw_path(
    [0,1,2,3], [0, 7, -10, -5], "red",
    path_name="Red path",
    linetypes=[4,4,3]
)

dia.add_path_labels("Red path", ["E", "TS", "P", "P2"])
dia.lines["Red path"].labels["0.0"].set_color("black")

dia.add_numbers_auto(x_min_max=(1,3))
dia.add_numbers_average(color="black", x_min_max=0)

dia.legend(fontsize=5)
dia.ax.set_ylabel(r"$\Delta E$ in kJ mol$^{-1}$", fontsize=8)

dia.fig.savefig(os.path.join("..", "docs", "img", "title", "image_5.png"), dpi=300, bbox_inches="tight")
dia.show()
Diagram 5

Example 6: Difference bar customization

from chemdiagrams import EnergyDiagram
import os.path

dia = EnergyDiagram(extra_x_margin=[0,0.5])

dia.draw_path(
    [0, 2], [3, 18], "blue",
    path_name="Blue states",
    linetypes=0
)

dia.add_path_labels("Blue states", ["S1", "S1"])

dia.draw_path(
    [0, 2], [-5, -12], "red",
    path_name="Red states",
    linetypes=0
)

dia.add_path_labels("Red states", ["S2", "S2"])

dia.draw_difference_bar(
    0.8, 
    (3, 18), 
    r"$\Delta E_\mathrm{R1}$: ",
    color="blue",  
    x_whiskers=(0,2),  
    arrowstyle="<->"
)

dia.draw_difference_bar(
    0.8, 
    (-5, -12), 
    r"$\Delta E_\mathrm{R2}$: ",
    color="red",  
    x_whiskers=(0,2), 
    arrowstyle="<->"
)

dia.draw_difference_bar(
    2.8, 
    (-12, 18), 
    r"$\Delta E_\mathrm{P}$: ",
    left_side=True,
    color="black",  
    x_whiskers=(2,2), 
    arrowstyle="<->",
    whiskercolor="blue"
)
dia.bars[2].whisker_1.set_color("red")

dia.add_numbers_auto()

dia.set_xlabels(["Educt\nStates", "Product\nStates"], labelplaces=[0,2], fontsize=6, weight="normal")
dia.ax.set_ylabel(r"$\Delta E$ in kJ mol$^{-1}$", fontsize=8)
dia.legend(fontsize=5)
dia.ax_objects.axes["x_axis"].set_visible(False)

dia.fig.savefig(os.path.join("..", "docs", "img", "title", "image_6.png"), dpi=300, bbox_inches="tight")
dia.show()
Diagram 6

Example 7: Smooth paths, number modification

from chemdiagrams import EnergyDiagram

dia = EnergyDiagram(style="halfboxed")

dia.draw_path(
    [0, 2, 4], [0, 78, -20], "blue",
    path_name="No catalyst",
    linetypes=4,
    width_plateau=0,
)

dia.draw_path(
    [0,1.2 ,1.8, 2.5, 4], [0, 32, 24, 38, -20], "red",
    path_name="With catalyst",
    linetypes=4,
    width_plateau=0,
)

dia.add_numbers_auto()

dia.modify_number_values(
    2, 
    x_add=2, 
    x_subtract=0,
    include_paths=["No catalyst"],
    brackets=("[", "]"), 
)

dia.modify_number_values(
    1.2, 
    x_add=1.2, 
    x_subtract=0,
    include_paths=["With catalyst"],
    brackets=("[", "]"), 
)

dia.modify_number_values(
    2.5, 
    x_add=2.5, 
    x_subtract=1.8,
    include_paths=["With catalyst"],
    brackets=("[", "]"), 
)

dia.ax.set_xlabel("Reaction Coordinate", fontsize=8)
dia.ax.set_ylabel(r"$\Delta E$ in kJ mol$^{-1}$", fontsize=8)

dia.legend(fontsize=5)
dia.fig.savefig(os.path.join("..", "docs", "img", "title", "image_7.png"), dpi=300, bbox_inches="tight")
dia.show()
Diagram 7

Example 8: Float energy values and image in plot

from chemdiagrams import EnergyDiagram
import os.path

dia = EnergyDiagram(style="open")

penguin = os.path.join("figures", "penguin.png")

dia.draw_path(
    [0, 1, 2, 3, 4], [0, 0.154, -0.382, -0.287, -0.748], "black",
)

dia.add_numbers_auto(
    n_decimals=2
)

dia.ax.set_ylabel(r"$\Delta E$ in eV", fontsize=8)
dia.set_xlabels(["E", "TS1", "I", "TS2", "P"], in_plot=True)

dia.add_image_in_plot(
    penguin,
    position=(0.6, -0.4),
    height=0.4
)

dia.fig.savefig(os.path.join("..", "docs", "img", "title", "image_8.png"), dpi=300, bbox_inches="tight")
dia.fig.savefig(os.path.join("..","docs","img","example_single_image.png"),format="png", bbox_inches="tight")
dia.show()
Diagram 8

Example 9: Connector line customization and number modification

from chemdiagrams import EnergyDiagram
import os.path

dia = EnergyDiagram()
dia.set_diagram_style("borderless")

dia.draw_path(
    [0,1,2,3,4,5,6], [0, 67, 42, 87, 15, 38, -20], "blue",
    path_name="Blue path",
    linetypes=2   
)

dia.draw_path(
    [0,1,2,3,4,5,6], [0, 37, 15, 23, -29, -12, -45], "red",
    path_name="Red path",
    linetypes=2   
)

dia.add_numbers_auto()
dia.add_path_labels("Blue path", ["E", "TS1", "I", "TS2", "I2", "TS3", "P"], color="black", fontsize=6)
dia.add_path_labels("Red path", [None, "TS1", "I", "TS2", "I2", "TS3", "P"], color="black", fontsize=6)

dia.modify_number_values(
    x=1,
    x_add=1,
    x_subtract=0
)

dia.modify_number_values(
    x=3,
    x_add=3,
    x_subtract=2
)

dia.modify_number_values(
    x=5,
    x_add=5,
    x_subtract=4
)

for path in dia.lines.values():
    for connector in path.connections.values():
        connector.set_lw(0.5)

dia.legend(fontsize=6)

dia.fig.savefig(os.path.join("..", "docs", "img", "title", "image_9.png"), dpi=300, bbox_inches="tight")
dia.show()
Diagram 9