Thanks to @swatchai. I modified his answer to fit my code. So that I got:
import numpy as np
import matplotlib.lines as mlines
import matplotlib.pyplot as plt
# my fig and my axes
fig, ax1 = plt.subplots(figsize=(6, 6))
# my plots
ax1.plot(temp, zn, color=cycle[0], label=r'$z_n$')
ax1.plot(temp, zp, color=cycle[1], label=r'$z_p$')
ax1.plot(temp, zpi, color=cycle[2], label=r'$z_\pi$')
# the other plots
ax1.plot(temp, zn2, color=cycle[0], linestyle='--')
ax1.plot(temp, zp2, color=cycle[1], linestyle='--')
ax1.plot(temp, zpi2, color=cycle[2], linestyle='--')
# Second legend 'imaginary' lines
line_solid = mlines.Line2D([], [], color='black', linestyle='-', \
linewidth=1.5, label=r'$n_b = n_0$')
line_dashed = mlines.Line2D([], [], color='black', linestyle='--', \
linewidth=1.5, label=r'$n_b = n_0/2$')
# original legend
leg1 = ax1.legend()
# set second legend (will remove first one)
leg2 = ax1.legend(handles=[line_solid, line_dashed], loc='best', \
bbox_to_anchor=(0.5, 0.20, 0.5, 0.6))
leg2.set_frame_on(False) # remove legend frame
# manually add the first legend back
ax1.add_artist(leg1)
The output (notice that the above code is not runnable and it seem I cannot embed pictures yet):
result
I actually wanted to avoid having to go through this step of creating new imaginary lines to assign a legend to them. I would have liked to know if it is possible to use the markers in a text too. But well, this at least solves my problem.
Thanks!