<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def plot_thermodynamic_properties(self, tmin, tmax, ntemp, ylim=None, **kwargs):
 """ Plots all the thermodynamic properties in a temperature range. Args: tmin: minimum temperature tmax: maximum temperature ntemp: number of steps ylim: tuple specifying the y-axis limits. kwargs: kwargs passed to the matplotlib function 'plot'. Returns: matplotlib figure """

        temperatures = np.linspace(tmin, tmax, ntemp)

        mol = "" if self.structure else "-c"

        fig = self._plot_thermo(self.dos.cv, temperatures, ylabel="Thermodynamic properties", ylim=ylim,
                                label=r"$C_v$ (J/K/mol{})".format(mol), **kwargs)
        self._plot_thermo(self.dos.entropy, temperatures, ylim=ylim, ax=fig.axes[0],
                          label=r"$S$ (J/K/mol{})".format(mol), **kwargs)
        self._plot_thermo(self.dos.internal_energy, temperatures, ylim=ylim, ax=fig.axes[0], factor=1e-3,
                          label=r"$\Delta E$ (kJ/K/mol{})".format(mol), **kwargs)
        self._plot_thermo(self.dos.helmholtz_free_energy, temperatures, ylim=ylim, ax=fig.axes[0], factor=1e-3,
                          label=r"$\Delta F$ (kJ/K/mol{})".format(mol), **kwargs)

        fig.axes[0].legend(loc="best")

        return fig