Ejemplo n.º 1
0
def plot_polarized_light(intensities,
                         deltaPhase=0,
                         fig=None,
                         show_components=False):
    if fig is None:
        fig = plt.figure(figsize=(20, 10))

    X = np.linspace(0, 2 * np.pi)
    Y = np.zeros_like(X)
    Z = np.zeros_like(X)

    V = intensities[0] * np.sin(X)
    W = intensities[1] * np.sin(X - deltaPhase)
    U = np.zeros_like(W)
    ax = fig.add_subplot(121, projection='3d', azim=-25, elev=20)

    ax.quiver(X, Y, Z, U, V, W, arrow_length_ratio=0.05, label="E")

    if show_components:
        ax.quiver(X,
                  Y,
                  Z,
                  U,
                  V,
                  np.zeros_like(W),
                  color=(1, 0, 0, 1),
                  arrow_length_ratio=0.05,
                  label="Ex")
        ax.quiver(X,
                  Y,
                  Z,
                  U,
                  np.zeros_like(V),
                  W,
                  color=(0, 1, 0, 1),
                  arrow_length_ratio=0.05,
                  label="Ey")

    ax.legend()

    X_ax = np.array([-(1), 0, 0])
    Y_ax = np.array([0, 1, 0])
    Z_ax = np.array([0, 0, -1])
    U_ax = np.array([5 + 2 * np.pi, 0, 0])
    V_ax = np.array([0, -1.5, 0])
    W_ax = np.array([0, 0, 1.5])
    ax.quiver(X_ax,
              Y_ax,
              Z_ax,
              U_ax,
              V_ax,
              W_ax,
              arrow_length_ratio=0.01,
              color=(0, 0, 0, 1))

    for x, y, z, txt in zip(X_ax + U_ax, Y_ax + V_ax, Z_ax + W_ax,
                            ["Z", "X", "Y"]):
        ax.text(x - 0.1, y, z, txt, fontsize=16)

    ax_2d = SubplotZero(fig, 122)
    fig.add_subplot(ax_2d)

    theta = np.linspace(0, 2 * np.pi, 1000)
    ax_2d.plot(np.cos(theta), np.sin(theta), 'k--', linewidth=2)

    # plt.annotate(s='Ey', xy=(0, -intensities[1]), xytext=(0, intensities[1]), horizontalalignment='center',
    #              verticalalignment='center',
    #              color='black', arrowprops=dict(arrowstyle='<->'),fontsize=18)
    #              verticalalignment='center',
    #              color='black', arrowprops=dict(arrowstyle='<->', shrinkA=0, shrinkB=0),
    ax_2d.plot(V, W, 'b-', linewidth=5)

    if intensities[0] > 1e-4:
        ax_2d.arrow(-0.8 * intensities[0],
                    0,
                    1.8 * intensities[0],
                    0,
                    linewidth=0,
                    width=0.01,
                    color='black',
                    shape="full",
                    length_includes_head=True)
        ax_2d.arrow(+0.8 * intensities[0],
                    0,
                    -1.8 * intensities[0],
                    0,
                    linewidth=0,
                    width=0.01,
                    color='black',
                    shape="full",
                    length_includes_head=True)
        plt.annotate(s='Ex',
                     xy=(-0.9 * intensities[0], 0.03),
                     xytext=(0.9 * intensities[0], 0.02),
                     horizontalalignment='center',
                     fontsize=18,
                     color='black')

    if intensities[1] > 1e-4:
        ax_2d.arrow(0,
                    -0.8 * intensities[1],
                    0,
                    1.8 * intensities[1],
                    linewidth=0,
                    width=0.01,
                    color='black',
                    shape="full",
                    length_includes_head=True)
        ax_2d.arrow(0,
                    +0.8 * intensities[1],
                    0,
                    -1.8 * intensities[1],
                    linewidth=0,
                    width=0.01,
                    color='black',
                    shape="full",
                    length_includes_head=True)
        plt.annotate(s='Ey',
                     xy=(0.06, -0.9 * intensities[1]),
                     xytext=(0.06, 0.9 * intensities[1]),
                     horizontalalignment='center',
                     fontsize=18,
                     color='black')
    # ax_2d.plot([0, 0],[0,intensities[1]],'k->', linewidth=4)

    ax_2d.set_xlim([-1.1, 1.1])
    ax_2d.set_ylim([-1.1, 1.1])
    # # ax_2d.text(1,0,"X", fontsize=16)
    # # ax_2d.text(0,1,"Y", fontsize=16)
    plt.xticks([])
    plt.yticks([])
    ax_2d.axis('off')
    # for direction in ["xzero", "yzero"]:
    #     ax_2d.axis[direction].set_axisline_style("-|>")
    #     ax_2d.axis[direction].set_visible(True)
    for direction in ["left", "right", "bottom", "top"]:
        ax_2d.axis[direction].set_visible(False)

    ax.set_axis_off()

    ax.set_xlim([0, 2 * np.pi])
    ax.set_ylim([-0.4, 0.4])
    ax.set_zlim([-0.4, 0.4])
    fig.tight_layout()
    plt.show()