如何在Python中展示坐标网格线的转换?

3
假设我有常规的笛卡尔坐标系$(x,y)$,并且我考虑一个矩形网格区域$D$(分成小正方形)。我想要看到在Python中如何将域$D$映射到坐标变换T:(x,y) -> (u(x,y) ,v(x,y) )下?
我需要像这样的东西:

enter image description here

看这里

我能得到一些建议吗?我是一个完全的 Python 和编程初学者。


你想在一个图中画出两个图形,并在它们之间画一个箭头吗? - 9769953
如果你是新手,为什么特别选择Python编程语言? - 9769953
我在互联网上搜索了“最简单的编程语言”,然后发现Python是其中之一。@9769953 - Hopeful Whitepiller
嗯,“画两个图形”...不完全是这样。我在左侧网格上有域,我想看看在变换下轮廓线和整个域如何映射。 - Hopeful Whitepiller
1
针对这个问题,Python并不是一个坏选择。 - Jussi Nurminen
2个回答

6

如果我理解你的意思正确,你想要看到一个转换后笛卡尔空间的类似网格的绘图?在这种情况下,也许可以使用Numpy和Matplotlib来做类似这样的事情。 (你也可以只用Pillow画一些线条,但是这更方便...)

编辑:根据评论中的讨论,与简单的原始版本(请参阅编辑历史记录)相比,我对此进行了一些修改,以便更容易绘制多个变换,并着色线条以便更容易跟踪它们如何被转换。尽管如此,它仍然相当简单。(为了好玩,我还添加了几个额外的变换。)

import math

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm

colormap = cm.get_cmap("rainbow")


def plot_grid(
    xmin: float,
    xmax: float,
    ymin: float,
    ymax: float,
    n_lines: int,
    line_points: int,
    map_func,
):
    """
    Plot a transformation of a regular grid.

    :param xmin: Minimum x value
    :param xmax: Maximum x value
    :param ymin: Minimum y value
    :param ymax: Maximum y value
    :param n_lines: Number of lines per axis
    :param line_points: Number of points per line
    :param map_func: Function to map the grid points to new coordinates
    """
    # List for gathering the lines into.
    lines = []

    # Iterate over horizontal lines.
    for y in np.linspace(ymin, ymax, n_lines):
        lines.append([map_func(x, y) for x in np.linspace(xmin, xmax, line_points)])

    # Iterate over vertical lines.
    for x in np.linspace(xmin, xmax, n_lines):
        lines.append([map_func(x, y) for y in np.linspace(ymin, ymax, line_points)])

    # Plot all the lines.
    for i, line in enumerate(lines):
        p = i / (len(lines) - 1)  # Normalize to 0-1.
        # Transpose the list of points for passing to plot.
        xs, ys = zip(*line)
        # Get the line color from the colormap.
        plt.plot(xs, ys, color=colormap(p))


# Define some mapping functions.


def identity(x, y):
    return x, y


def example(x, y):
    c = complex(x, y) ** 2
    return (c.real, c.imag)


def wobbly(x: float, y: float):
    return x + math.sin(y * 2) * 0.2, y + math.cos(x * 2) * 0.3


def vortex(x: float, y: float):
    dst = (x - 2) ** 2 + (y - 2) ** 2
    ang = math.atan2(y - 2, x - 2)
    return math.cos(ang - dst * 0.1) * dst, math.sin(ang - dst * 0.1) * dst


# Set up the plot surface...
plt.figure(figsize=(8, 8))
plt.tight_layout()

plt.subplot(2, 2, 1)
plt.title("Identity")
plot_grid(0, 4, 0, 4, 10, 10, identity)

plt.subplot(2, 2, 2)
plt.title("Example")
plot_grid(0, 4, 0, 4, 10, 10, example)

plt.subplot(2, 2, 3)
plt.title("Wobbly")
plot_grid(0, 4, 0, 4, 10, 40, wobbly)

plt.subplot(2, 2, 4)
plt.title("Vortex")
plot_grid(0, 4, 0, 4, 10, 40, vortex)

plt.savefig("so71735261-2.png")
plt.show()

结果图像为: 输入图像描述

快速问题,如何更改函数?例如,如何放置sin(z)? - Hopeful Whitepiller
更改 get_point 内部的内容。 - AKX
1
当然,稍等一下... - AKX
@Buraian 请查看编辑 :-) - AKX
1
@Buraian,我很高兴能帮到你!(顺便说一下,你的个人资料中的无洞奶牛变形让我笑了,所以谢谢你!) - AKX
显示剩余2条评论

-2

这并不是完全简单的。您需要学习如何使用绘图库来创建图形,例如matplotlib。您还需要弄清楚如何创建、离散化和转换常规网格。numpy库非常适用于此类操作。无论如何,我不确定这对于“完全初学者”来说是否是一个好问题。如果您完全不了解编程或Python,我建议从更简单的事情开始。


实际上,我的动机是我正在阅读Tristan Needham的《Visual Complex Analysis》一书。该书建议使用计算机程序多次绘制复杂函数。书中建议的许多程序现在不可用/不免费使用,因此我想看看是否可以仅通过Python实现这一点。 - Hopeful Whitepiller
如果您能为我提供一个解决此问题所需知道的路线图,那就太好了。这是我非常想做的事情。 - Hopeful Whitepiller
路线图如下:1)学习Python的基础知识,然后2)学习使用matplotlib和numpy库。如果您在不先了解Python基础知识的情况下尝试学习这些(相当庞大且复杂)库,可能只会导致挫败感。 - Jussi Nurminen
我已经研究了这些库,虽然它们似乎相关,但我无法确切地看出如何利用这些库的知识来解决这种情况。 - Hopeful Whitepiller
1
我会先在numpy数组中定义一个复数正则网格(代表网格点),然后使用所需的复杂操作将其转换为另一个数组。然后,我会尝试将两个数组绘制成一堆曲线,可能使用某种插值方法在计算出的点之间获得平滑的曲线。对于这些库的经验丰富用户来说,这并不太难。但我认为这不是一个好的第一个问题。 - Jussi Nurminen
显示剩余3条评论

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