Lin
Lin

Reputation: 1203

Simple line with annotations

Is there any simpler way to have this line (with two annotations) using matplotlib?

The idea is just draw a line showing a interval ([0,T]) and some points with annotations. This code is too big for such a small thing.

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

plt.ylim(-.3,.3)
plt.xlim(0, 1)
xmin, xmax = ax.get_xlim()

# removing the default axis on all sides:
for side in ['bottom','right','top','left']:
    ax.spines[side].set_visible(False)

# removing the axis ticks
plt.xticks([]) 
plt.yticks([])
ax.xaxis.set_ticks_position('none')
ax.yaxis.set_ticks_position('none')

# draw x and y axis
ax.arrow(xmin, 0, xmax-xmin, 0, fc='k', ec='k',
         length_includes_head= True, clip_on = False)

esp=0.05

ax.text(0.5, esp, r'$\Delta t$', ha='center')

ax.text(0.45, 0,    r'$|$',   ha='center')
ax.text(0.45, -esp, r'$t_i$', ha='center')

ax.text(0.55, 0,    r'$|$',       ha='center')
ax.text(0.55, -esp, r'$t_{i+1}$', ha='center')

ax.text(0, 0,    r'$|$', ha='center')
ax.text(0, -esp, r'$0$', ha='center')

ax.text(1, 0,    r'$|$', ha='center')
ax.text(1, -esp, r'$T$', ha='center')

plt.show()

Upvotes: 0

Views: 66

Answers (2)

matusko
matusko

Reputation: 3777

I found similar solution using the x-axis but it is a little more compact

plt.ylim(0,.3)
plt.xticks([0, 0.45, 0.55, 1], 
           ('$0$', '$t_i$', '$t_{i+1}$', '$T$'), 
           size=20, 
           verticalalignment='top') 
plt.tick_params(axis='x', 
                direction='inout', 
                length=20, 
                pad=15, 
                bottom=True, 
                top=False)

Another approach is drawing the ticks as scatterplot and annotating each, i.e.

for x, label in [(0, '$0$'), (0.45, '$t_i$'), (0.55, '$t_{i+1}$'), (1, '$T$')]:
    plt.scatter(x, 0,  s=50, marker='|')
    plt.annotate(label, [x,-0.05], size=20)

Upvotes: 1

ImportanceOfBeingErnest
ImportanceOfBeingErnest

Reputation: 339250

One could use the xaxis as the line to draw the intervals. That would allow to use its ticks and ticklabels for the annotations.

import matplotlib.pyplot as plt

fig,ax = plt.subplots()
plt.subplots_adjust(bottom=0.5, top=0.7)
for side in ['right','top','left']:
    ax.spines[side].set_visible(False)
ax.set_yticks([])

ticks=[0,.45,.55,1]
ticklabels=[0,r'$t_i$', r'$t_{i+1}$',r'$T$']
ax.set_xticks(ticks)
ax.set_xticklabels(ticklabels)
ax.tick_params(direction='inout', length=10,pad=7)

ax.text(0.5, 0.2, r'$\Delta t$', ha='center')

plt.show()

enter image description here

Upvotes: 1

Related Questions