首页 > 编程问答 >使用 Python 绘图

使用 Python 绘图

时间:2024-07-21 11:19:57浏览次数:5  
标签:python numpy plot matplotlib

我有一个 .txt 文件,从中找到有序对,然后使用 numpy 和 matplotlib 绘制图形。例如,这些是我的有序对:

[[(4.0, 0), (0, 6.0)], [(6.0, 0), (0, 3.0)]]

(每个子列表代表最终图形中的一条线)

图形如下所示:

grafik1

但我想找到两条线之间的交点。 如果有更多的线,我怎样才能找到它们之间的公共区域?例如

grafik2


以下是使用 Python 查找直线交点并阴影化公共区域的方法:

import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import Polygon, LineString
from shapely.ops import polygonize

def find_intersection(line1, line2):
    """查找两条线的交点。

    Args:
        line1: 格式为 ((x1, y1), (x2, y2)) 的元组,表示第一条线。
        line2: 格式为 ((x1, y1), (x2, y2)) 的元组,表示第二条线。

    Returns:
        一个表示交点的元组 (x, y),如果线平行,则返回 None。
    """
    (x1, y1), (x2, y2) = line1
    (x3, y3), (x4, y4) = line2

    denom = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)
    if denom == 0:  # 线平行
        return None

    x = ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) / denom
    y = ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) / denom
    return x, y


def plot_lines_and_intersection(lines):
    """绘制直线并阴影化公共区域。

    Args:
        lines: 直线列表,其中每条线都表示为 ((x1, y1), (x2, y2))。
    """
    fig, ax = plt.subplots()

    # 收集所有线段以构建多边形
    all_segments = []
    for line in lines:
        all_segments.append(LineString(line))
        ax.plot(*zip(*line), label=f"Line {lines.index(line)+1}")

    # 找到所有交点
    intersections = []
    for i in range(len(lines)):
        for j in range(i + 1, len(lines)):
            intersection = find_intersection(lines[i], lines[j])
            if intersection:
                intersections.append(intersection)

    # 使用 Shapely 创建多边形
    polygon = Polygon(shell=all_segments).intersection(Polygon(shell=all_segments[::-1]))
    if polygon.geom_type == 'Polygon':
        # 填充多边形
        ax.fill(*polygon.exterior.xy, alpha=0.3)
    elif polygon.geom_type == 'MultiPolygon':
        for poly in polygon:
            ax.fill(*poly.exterior.xy, alpha=0.3)


    # 绘制交点
    for intersection in intersections:
        ax.plot(*intersection, 'ro')

    ax.set_xlabel("X 轴")
    ax.set_ylabel("Y 轴")
    ax.set_title("直线和交点")
    ax.legend()
    plt.grid(True)
    plt.show()

# 示例用法:
lines = [[(4.0, 0), (0, 6.0)], [(6.0, 0), (0, 3.0)]]  # 的示例数据
plot_lines_and_intersection(lines)

说明:

  1. find_intersection(line1, line2) 此函数使用两条线的数学公式来查找其交点。如果线平行,则返回 None
  2. plot_lines_and_intersection(lines)
  3. 它遍历 lines 列表,并使用 ax.plot() 绘制每条线。
  4. 它调用 find_intersection() 来查找所有线对之间的交点。
  5. 它使用 shapely.geometry 模块来:
    • 使用 LineString 创建所有线段的表示。
    • 通过将线段传递到 Polygon 来构造一个多边形。
    • 找到 polygonize 操作的结果多边形的交集,以获取公共区域。
  6. 如果找到交点,则使用 ax.plot() 将其绘制为红点。
  7. 它使用 ax.fill() 填充公共区域。
  8. 最后,它设置标签、标题、图例并显示绘图。

要从 .txt 文件加载数据:

  1. 假设的 .txt 文件包含以下格式的数据: 4.0 0 0 6.0 6.0 0 0 3.0 每行代表一条线,坐标用空格分隔。

  2. 使用以下代码从文件中读取数据:

python with open("your_file.txt", "r") as f: lines = [((float(line.split()[0]), float(line.split()[1])), (float(line.split()[2]), float(line.split()[3]))) for line in f]

这将读取文件并将数据解析为 lines 列表,然后可以将其传递给 plot_lines_and_intersection(lines)

标签:python,numpy,plot,matplotlib
From: 10647500

相关文章

  • 用python计算形状的距离
    我想计算该图像的最小垂直距离和最大水平距离。就像线条一样。我正在尝试:_,binary_image=cv2.threshold(image,0,255,cv2.THRESH_BINARY)horizontal_distances=np.sum(binary_image==255,axis=1)max_horizontal_distance=np.max(horizontal_distance......
  • 在感知器学习模型的 Python 实现中将数组传递给 numpy.dot()
    我正在尝试将单层感知器分类器的Python实现放在一起。我发现SebastianRaschka的《Python机器学习》一书中的示例非常有用,但我对他的实现的一小部分有疑问。这是代码:importnumpyasnpclassPerceptron(object):"""Perceptronclassifier.Parameters......
  • 带时间戳的 Python 命令行历史记录
    有没有办法记录每个命令的时间?例如,挂钩交互式shell,以便它将相同的内容写入~/.python_history到~/.python_history_timestamps但带有时间戳?我正在跟踪我白天所做的事情并将其放入我的日历中。为了帮助回溯,我使用了firefox历史记录、Dropbox活动、一个......
  • 在 python3 中迭代字典键时无法删除它:“RuntimeError:字典在迭代期间更改了大小”
    我试图在迭代字典时从字典中删除一个键。从字典中删除键时,我得到:RuntimeError:dictionarychangedsizeduringiteration我的代码:mydict={'one':1,'two':2,'three':3,'four':4}fork,vinmydict.items():ifk=='two'......
  • Python pyTelegramBotAPI:设置不受循环影响的变量
    我想创建一个基本上是布尔值的变量(无论机器人是否工作)。但是,当使用TeleBot.polling()时,脚本开始无限循环,所以如果我在代码开头设置一个变量就像:is_bot_working=True,变量将始终为真,反之亦然。那么,我应该如何设置一个不受循环影响的变量?这就是代码:impor......
  • 编解码器无法解码位置 2-3 中的字节:截断的 \UXXXXXXXX 转义 (Python QREADER)
    我正在尝试pythonqreader模块,但每次我尝试运行它时,我都会收到SyntaxError:(unicodeerror)'unicodeescape'codeccan'tDecodebytesinposition2-3:truncated\UXXXXXXXXescapeerror.fromqreaderimportQReaderfromcv2importQRCodeDetector,imreadfrompyz......
  • Python 工程师对 3D 高斯溅射的介绍(第 1 部分)
    从Python工程师的角度理解和编写GaussianSplatting欢迎来到雲闪世界。2023年初,来自法国蔚蓝海岸大学和马克斯普朗克信息研究所的作者发表了一篇题为“用于实时场渲染的3D高斯溅射”的论文。¹该论文展示了实时神经渲染的重大进步,超越了NeRF等先前方法的实用性。²......
  • 使用Python读取PDF文件,部分内容显示为一串乱码。我应该如何恢复它?
    使用Python读取PDF文件,部分内容显示为一串乱码。我该如何恢复它?importfitzdoc=fitz.open("2303.11366v4.pdf")#downloadfromhttps://arxiv.org/pdf/2303.11366print(doc[2].get_text().split('Figure1')[0])我得到了这样的文字:<RXDUHLQWKHPLGGOHRIDURRP>@7DVN......
  • Python 迭代列表
    分配sum_extra给定列表test_grades收到的额外学分总额。满分是100分,所以超过100分都是额外分。对于给定程序,sum_extra是8,因为1+0+7+0是8。给定程序的示例输出:额外总和:8请原谅我,我是编码新手,而且真的很糟糕!这是我的代码(不起作用)请......
  • 计算机毕业设计Python+Spark新能源汽车推荐系统 汽车大数据 汽车数据分析 汽车可视化
    表2黄河交通学院本科毕业设计(论文)开题报告学生姓名刘丹杰专业班级20本大数据一班学号2080910T01521设计(论文)题目基于Hadoop的新能源汽车销售数据分析系统的设计与实现选题的目的和意义:选题目的:新能源汽车销售数据分析系统的设计与实现旨在利用Hadoop等大数......