5

I am trying to draw tines that look like tick-marks on the sides of an equilateral triangle. I am doing this using Matplotlib in Python.

Here is the equilateral triangle***:

import matplotlib.pyplot as plt
from pylab import *
fig = figure()
ax = fig.add_subplot(111)
ax.axis('equal')
ax.plot([1, 0.5], [0, 0.866], 'k-')
ax.plot([0, 0.5], [0, 0.866], 'k-')
ax.plot([0, 1], [0, 0], 'k-')
ax.plot([0.5, 1.01, 0.1], [-0.01, 0.5, 0.88], 'w.') #base boundary
plt.show()

The resulting image is seen here.triangle_from_code.

Now, I would like to add lines that look like tick marks. The lines would be drawn like seen here from 1:07-1:29 and from 2:19-2:32.

I would like the output to look something like this image.enter image description here

Is there a way to draw these lines with Matplotlib?

EDIT: *** triangle code as per here

2
  • 1
    Is there a reason you don't simply draw them as lines just as you did with the triangle? Commented Jun 22, 2015 at 5:16
  • Yes, I could have done that. However, I was not sure how to put the lines at the proper spacing. That was the problem I had, which is why I could not add the ticks as lines. Commented Jun 22, 2015 at 12:02

1 Answer 1

5

This does more or less what you want:

from __future__ import division
import matplotlib.pyplot as plt
import numpy as np

def plot_ticks(start, stop, tick, n):
    r = np.linspace(0, 1, n+1)
    x = start[0] * (1 - r) + stop[0] * r
    x = np.vstack((x, x + tick[0]))
    y = start[1] * (1 - r) + stop[1] * r
    y = np.vstack((y, y + tick[1]))
    plt.plot(x, y, 'k', lw=1)

n = 10
tick_size = 0.2
margin = 0.05

# define corners of triangle    
left = np.r_[0, 0]
right = np.r_[1, 0]
top = np.r_[0.5, 3**0.5 / 2]
triangle = np.c_[left, right, top, left]

# define vectors for ticks
bottom_tick = tick_size * (right - top) / n
right_tick = tick_size * (top - left) / n
left_tick = tick_size * (left - right) / n

plt.plot(triangle[0], triangle[1], 'k', lw=2) 
plot_ticks(left, right, bottom_tick, n)
plot_ticks(right, top, right_tick, n)
plot_ticks(left, top, left_tick, n)
plt.axis([left[0]-margin, right[0]+margin, left[1]-margin, top[1]+margin])
plt.gca().set_aspect('equal', adjustable='box')
plt.show()    

Result: enter image description here

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.