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).

Example of how I would imagine a possible result

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.

Matplotlib Contour Demo

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.

enter image description here

18
demandé sur Community 2015-07-30 13:00:58

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:

plot

vous pouvez jouer avec les offsets pour des résultats plus agréables.

1
répondu mtd 2016-01-16 07:51:27