Graphique ligne pointillée interrompue par des données (similaire au graphique de contour))
je suis coincé avec un (espérons) problème simple. Mon but est de tracer une ligne pointillée interrompue par des données (pas seulement du texte).
comme j'ai seulement découvert pour créer une ligne pointillée via linestyle = 'pointillés', toute aide est appréciée pour mettre les données entre les tirets.
quelque chose de similaire, concernant l'étiquetage, existe déjà avec Matplotlib - comme je l'ai vu dans la ligne de contour démo.
mise à Jour:
lien question mentionné par Richard dans les commentaires était très utile, mais pas le 100% comme je l'ai mentionné via comment. Actuellement, je le fais de cette façon:
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 to 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))
Ici vous pouvez voir un aperçu du résultat. Le - 20°c est sans BBox.
1 réponses
Rapide et sale de réponse à l'aide de annotate
:
import matplotlib.pyplot as plt
import numpy as 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 is 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
for 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)]))
a = 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")
Donne:
vous pouvez jouer avec les offsets pour des résultats plus agréables.