简体   繁体   中英

Drawing hatch filled rectangles with differing angles in python

I'm trying to draw a 2D rectangular plate in python. This plate will be split into a variable number of sections, each of these sections will be filled with a hatched pattern. This hatched pattern will have a specified angle. As an example for a rectangle with 5 sections and an array of its section hatch orientation (in degrees) being [0, 45, 0, -45, 0] is shown below. It will need to be able to display any orientation, not just the usual 90, 45, 0, ie 33, 74.5 etc.

在此输入图像描述

Any idea how I could do this? Essentially I just want to show the orientation in each section, any other methods of expressing the same results would be much appreciated eg a single line instead of hatched.

Edit (after question was answered): Edited script provided by Greg is shown below.

from numpy import cos, sin
import numpy as np
import matplotlib.pyplot as plt

angles = [0,10,20,30,40,50]

numberOfSections = len(angles)

def plot_hatches(ax, angle, offset=.1):
    angle_radians = np.radians(angle)
    x = np.linspace(-1, 1, 10)
    for c in np.arange(-2, 2, offset):
        yprime = cos(angle_radians) * c - sin(angle_radians) * x
        xprime = sin(angle_radians) * c + cos(angle_radians) * x
        ax.plot(xprime, yprime, color="b", linewidth=2)
    ax.set_ylim(0, 1)
    ax.set_xlim(0, 1)
    return ax

fig, axes = plt.subplots(nrows=1, ncols=numberOfSections, figsize=(16,(16/numberOfSections)), sharex=True, sharey=True)

for i in range(len(axes.flat)):
    plot_hatches(axes.flat[i], angles[i])

fig.subplots_adjust(hspace=0, wspace=0)  
plt.show()

Produces an figure shown below. 在此输入图像描述 But on inspection the angles do not match the input angles.

I have a basic idea although I suspect you will need to do quite a bit more depending how flexible you want the result to be.

from numpy import cos, sin
import numpy as np
import matplotlib.pyplot as plt

def plot_hatches(ax, angle, offset=.1):
    angle_radians = np.radians(angle)
    x = np.linspace(-2, 2, 10)
    for c in np.arange(-2, 2, offset):
        yprime = cos(angle_radians) * c + sin(angle_radians) * x
        xprime = sin(angle_radians) * c - cos(angle_radians) * x
        ax.plot(xprime, yprime, color="k")
    ax.set_ylim(0, 1)
    ax.set_xlim(0, 1)
    return ax


fig, axes = plt.subplots(nrows=4, ncols=4, figsize=(8,8), sharex=True, sharey=True)

for i in range(len(axes.flat)):
    plot_hatches(axes.flat[i], np.random.uniform(0, 90))

fig.subplots_adjust(hspace=0, wspace=0)   

There is two things parts here: firstly a function plot_hatches which draws hatches over the unit square on the axes ax . This is done by taking a single line x, y=c and rotating it using rotation matrix to get a xprime and yprime which are the coordinates of lines at an angle to the x axis with offset c . Iterating over several values of c covers the unit square, the lines can be made denser by making the offset argument smaller.

Secondly we need a method to draw the axes next to each other. This I have done using subplots . This returns fig, axes the axes is an array of axes instances, so we iteratate through them passing them into the function to plot hatches and give it a random angle each time.

在此输入图像描述

EDIT I have changed the plot_hatches code to rotate in an anticlockwise manner (it was clockwise before this edit). This will now produce exactly the image given in the question with the array [0, -45, 0, 45, 0] : 在此输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM