python - Plot dashed line interrupted with data (similar to contour plot) -
i stuck (hopefully) simple problem. aim plot dashed line interrupted data (not text).
as found out create dashed line via linestyle = 'dashed', appreciated put data between dashes.
something similar, regarding labeling, existing matplotlib - saw in the contour line demo.
update:
the question link mentioned richard in comments helpful, not 100% mentioned via comment. currently, way:
line_string2 = '-10 ' + u"\u00b0" +"c" l, = ax1.plot(t_m10_x_values,t_m10_y_values) pos = [(t_m10_x_values[-2]+t_m10_x_values[-1])/2., (t_m10_y_values[-2]+t_m10_y_values[-1])/2.] # transform data points screen space xscreen = ax1.transdata.transform(zip(t_m10_y_values[-2::],t_m10_y_values[-2::])) rot = np.rad2deg(np.arctan2(*np.abs(np.gradient(xscreen)[0][0][::-1]))) ltex = plt.text(pos[0], pos[1], line_string2, size=9, rotation=rot, color='b',ha="center", va="bottom",bbox = dict(ec='1',fc='1', alpha=0.5))
here can see snapshot of result. minus 20°c without bbox.
quick , dirty answer using annotate
:
import matplotlib.pyplot plt import numpy np x = list(reversed([1.81,1.715,1.78,1.613,1.629,1.714,1.62,1.738,1.495,1.669,1.57,1.877,1.385])) y = [0.924,0.915,0.914,0.91,0.909,0.905,0.905,0.893,0.886,0.881,0.873,0.873,0.844] def plot_with_text(x, y, text, text_count=none): text_count = (2 * (len(x) / len(text))) if text_count none else text_count fig, ax = plt.subplots(1,1) l, = ax.plot(x,y) text_size = len(text) * 10 idx_step = len(x) / text_count idx_num in range(text_count): idx = int(idx_num * idx_step) text_pos = [x[idx], y[idx]] xscreen = ax.transdata.transform(zip(x[max(0, idx-1):min(len(x), idx+2)], y[max(0, idx-1):min(len(y), idx+2)])) = np.abs(np.gradient(xscreen)[0][0]) rot = np.rad2deg(np.arctan2(*a)) - 90 ax.annotate(text, xy=text_pos, color="r", bbox=dict(ec="1", fc="1", alpha=0.9), rotation=rot, ha="center", va="center") plot_with_text(x, y, "test")
yields:
you can play offsets more pleasing results.
Comments
Post a Comment