使用Python绘制带不同角度填充的阴影矩形

5
我正在尝试在Python中绘制一个2D矩形板。该板将被分成可变数量的部分,每个部分都将填充有一种指定角度的斜线图案。以下是一个具有5个部分和其部分阴影方向数组(以度为单位)为[0, 45, 0, -45, 0]的矩形示例。它需要能够显示任何方向,而不仅仅是通常的90、45、0,例如33、74.5等。
任何想法如何实现这一点?实质上,我只想在每个部分中显示方向,非常感谢您提供任何其他表达相同结果的方法,例如单行而不是阴影。
编辑(问题回答后): Greg提供的编辑脚本如下所示。
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()

生成如下图所示的图形。 enter image description here 但是经过检查,角度并不与输入的角度相匹配。

1个回答

4

我有一个基本的想法,尽管我怀疑你需要做更多的工作,这取决于你想要的结果有多灵活。

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)   

这里有两个部分:首先是一个函数plot_hatches,它在坐标轴ax上绘制单元正方形上的图案。这是通过取一条单行线x, y=c并使用旋转矩阵旋转它来完成的,从而得到xprimeyprime,它们是与x轴成角度偏移c的直线的坐标。通过迭代几个c值,可以覆盖单位正方形,使线条变得更密集,可以通过使offset参数更小来实现。
其次,我们需要一种方法来将坐标轴绘制在彼此旁边。我使用subplots来完成这个任务。这将返回fig, axes,其中axes是一组轴实例,因此我们遍历它们并将它们传递到函数中绘制出具有任意角度的阴影。
编辑:我已经更改了plot_hatches代码以逆时针旋转(在此编辑之前为顺时针)。这将现在产生与问题中给定数组[0, -45, 0, 45, 0]完全相同的图像:

非常感谢您的帮助。如果您不介意,我有几个问题。现在它产生了随机角度的填充图案,我如何让它使用指定的数组[0,63,86,-11]产生一个1X4的网格呢?因此,我想能够指定角度。再次感谢您的帮助! - user2739143
在 for 循环中,我调用 plot_hatches 函数,它接受两个参数:第一个是要绘制的轴,第二个是角度。要将其变成 1x4 的格式,需要更改 plt.subplots 中的行数和列数(这是创建轴的地方)。然后运行 for 循环,但是不要随机生成角度,而是从列表中插入你的角度。建议将这个脚本保存下来,并进行修改。如果遇到问题,请告诉我。 - Greg
Greg,我现在已经更改了代码,可以指定自己的角度数组,但是这些角度似乎不正确。我已经编辑了原始问题并向您展示。 - user2739143
谢谢Greg。我认为只要每个子图保持正方形,角度就是正确的,但我最有可能使用矩形部分。如何实现这一点? - user2739143

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接