Matplotlib,添加多行文本。添加可以跟随曲线的文本

2023-11-23

我已将文本添加到绘图中,在每行中进行编码,然后调整它看起来不错,增加或减少宽度,或更改位置。但是,有没有办法让 Python 知道您想要文本的位置以及如何设置它?然后我可以添加文本,Python 将计算出详细信息。

例如,看看下面的图片:

enter image description here

在图中,我在左上角有 3 行文本,在绘图线上方有一行。

我必须调整 3 条线以获得合适的间距。这不是一项困难的任务,但如果我可以说这里是文本,这里是位置,然后 Python 以适当的间距堆叠它,那就很容易了。

对于孤线,我必须进行调整,使其不在线上并降低线。对于这种情况,是否可以告诉 python 我想要图上方和下方 80% 的文本?

我习惯于LaTeX我可以在其中进行调整,而无需对坐标进行硬编码。优点是

(1) if I want to change the location, I can change the percentage shift and not the coordinate.

(2) if the line is angled, the text will adjust to the line.

(2) 的优点是我尝试将文本放置在随线条向上倾斜的图形顶部部分。

这可以做到还是我要求太多?如果是这样,我该怎么做?

这是实现该图的代码:

import numpy as np
import pylab

r1 = 1  #  AU Earth                                                                 
r2 = 1.524  #  AU Mars                                                              
deltanu = 75 * np.pi / 180  #  angle in radians                                     
mu = 38.86984154054163

c = np.sqrt(r1 ** 2 + r2 ** 2 - 2 * r1 * r2 * np.cos(deltanu))   
s = (r1 + r2 + c) / 2
am = s / 2


def g(a):
    alphag = 2* np.pi - 2 * np.arcsin(np.sqrt(s / (2 * a)))
    return (np.sqrt(a ** 3 / mu)
            * (alphag - betag - (np.sin(alphag) - np.sin(betag))))


def f(a):
    alpha = 2 * np.arcsin(np.sqrt(s / (2 * a)))
    beta = 2 * np.arcsin(np.sqrt((s - c) / (2 * a)))
    return (np.sqrt(a **3 / mu) * (alpha - betag - (np.sin(alpha)
                                                      - np.sin(betag))))


betag = -2 * np.arcsin(np.sqrt((s - c) / (2 * a)))
a = np.linspace(am, 2, 500000)

a = np.linspace(am, 2, 500000)

fig = pylab.figure()
ax = fig.add_subplot(111)
ax.plot(a, f(a), color = '#000000')
ax.plot(a, g(a), color = '#000000')
pylab.xlim((0.9, 2))
pylab.ylim((0, 2))

pylab.xlabel('Semi-major Axis $a$ in AU')
pylab.ylabel('Time of Flight in Years')
pylab.text(1, 1.8, '$r_1 = 1.0$ AU', fontsize = 11, color = 'r')
pylab.text(1, 1.7, '$r_2 = 1.524$ AU', fontsize = 11, color = 'r')
pylab.text(1, 1.6, '$\\Delta \\nu = 75^{\\circ}$', fontsize = 11,
           color = 'r')
pylab.text(1.75, 0.35, '$\\alpha = \\alpha_0$', fontsize = 11,
           color = 'r')
pylab.savefig('lamberttransferties.eps', format = 'eps')
pylab.show()

您可以使用行分隔符\n:

 pylab.text(1, 1.5, '$r_1 = 1.0$ AU\n' +\
                    '$r_2 = 1.524$ AU\n' +\
                    '$\\Delta \\nu = 75^{\\circ}$', fontsize = 11, color = 'r')

pylab.text()默认情况下使用数据坐标,但您可以使用相对位置(0,0)到左下角和(1,1)到右上角,传递参数transform。看这个例子:

pylab.text(0.6, 0.75, 'using axis coords', transform=ax.transAxes)

参数:verticalalignment and horizontalalignment也可以给你很大的帮助。假设您想在最角落放置文本:

pylab.text(1.,1.,'top-right', transform=ax.transAxes,
           horizontalalignment='right', verticalalignment='top')

pylab.text(0.,0.,'bottom-left', transform=ax.transAxes,
           horizontalalignment='left', verticalalignment='bottom')

enter image description here

要根据您的数据自动计算文本的角度,您可以执行以下方法:

  • 检测数据最近点
  • 找到最近点附近的序列并使用该序列拟合曲线(下面的示例使用四阶曲线)
  • 计算您想要放置文本的位置的导数
  • 修正导数ax.get_data_ratio()OBS:不需要,如果ax.axis('scaled')例如使用

该算法可以如下实现:

def rtext(line,x,y,s, **kwargs):
    from scipy.optimize import curve_fit
    xdata,ydata = line.get_data()
    dist = np.sqrt((x-xdata)**2 + (y-ydata)**2)
    dmin = dist.min()
    TOL_to_avoid_rotation = 0.3
    if dmin > TOL_to_avoid_rotation:
        r = 0.
    else:
        index = dist.argmin()
        xs = xdata[ [index-2,index-1,index,index+1,index+2] ]
        ys = ydata[ [index-2,index-1,index,index+1,index+2] ]
        def f(x,a0,a1,a2,a3):
            return a0 + a1*x + a2*x**2 + a3*x**3
        popt, pcov = curve_fit(f, xs, ys, p0=(1,1,1,1))
        a0,a1,a2,a3 = popt
        ax = pylab.gca()
        derivative = (a1 + 2*a2*x + 3*a3*x**2)
        derivative /= ax.get_data_ratio()
        r = np.arctan( derivative )
    return pylab.text(x, y, s, rotation=np.rad2deg(r), **kwargs)

下面的测试示例展示了如何使用它:

ax = pylab.subplot(111)
thetas = np.linspace(0,6*np.pi,1000)
i = np.arange(len(thetas))
xdata = (1. + (3.-1.)*i/len(thetas))*np.cos(thetas)
ydata = (1. + (3.-1.)*i/len(thetas))*np.sin(thetas)
ax.plot(xdata, ydata, color = 'b')
pylab.xlabel('x')
pylab.ylabel('y')
for x, y in zip(xdata,ydata)[::25]:
    rtext(ax.lines[0], x, y,
          '$\\alpha = \\alpha_0$', fontsize = 14, color = 'r',
          horizontalalignment='center', verticalalignment='center')

enter image description here

改变verticalalignment='bottom'

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matplotlib,添加多行文本。添加可以跟随曲线的文本 的相关文章

随机推荐

  • 为什么带有“track by”的 Angular ng-options 无法通过 id 选择

    我有一组使用 ng options 显示的对象 并使用 id 设置 ng model 如果我添加track by在上面 该项目无法选择 如果不添加 则工作正常 为什么 以下代码 angular module myApp controller
  • 错误:Access-Control-Allow-Headers 不允许请求标头字段 Content-Type

    我使用vS2012创建了一个mvc4 web api项目 我使用以下教程来解决跨源资源共享 http blogs msdn com b carlosfigueira archive 2012 07 02 cors support in as
  • TCP接收数据

    如果我在 TCP 中发送 1000 字节 是否能保证接收者 一起 收到全部 1000 字节 或者也许他首先只会收到 500 个字节 然后他会收到其他字节 EDIT 问题来自应用程序的角度 如果 1000 字节在到达应用程序之前被重新组装成单
  • 保存可在任何网站上编辑的内容所做的更改

    以下代码允许任何网站暂时完全可编辑 document body contentEditable true 如果我想使用此方法保存对特定网站所做的设置 如何使用 Javascript 和 PHP 如果需要 实现此目的 以便下次访问此 URL
  • 如何更改 VS Code 中的装订线宽度?

    如何使排水沟宽度更大 我想要它是当前宽度的 4 5 倍 请参见下图 宽度是一个生成的动态值 直接在 VScode 中通过多次测量得出 看here了解那里发生了什么 改变这一点并非易事 您必须自己深入研究代码并做好可能产生不良影响的准备 有一
  • 如何制作 Android 应用程序的评论副本?

    有人要求我提供一些我编写的 Android 应用程序的评论副本 这很棒 但我不愿意将完整的应用程序提供给任何人 我想做一个限时版本 可以工作两周左右 然后就放弃了 做到这一点最简单的方法是什么 我自己还没有对此进行测试 但我认为理论上 如果
  • 是否存在遵循本福德定律的随机数分布?

    Python 有多种方法来生成不同分布的随机数 请参阅的文档random module 不幸的是 如果没有适当的数学背景 特别是考虑到所需的参数 它们就不太容易理解 我想知道这些方法是否能够产生服从分布的随机数本福德定律 以及什么参数值是合
  • 在 iPad 上使位于文本框上的图像可点击(为 iOS 创建 HTML5 搜索输入类型)

    我正在尝试模拟 HTML5input type search 使用 JavaScript 我的目标是做这样的事情 首先 我将说明为什么我不直接使用 HTML5 搜索输入类型 对于 iPad 上述输入类型显示圆角文本框 本机搜索输入框所需的所
  • 将绘图保存为封装后记 (.eps) 时,R 丢失信息

    Lyx 和 Latex 可以很好地处理 eps 图像 但是 当我从 Rstudio 导出带有平滑曲线的散点图时 点会丢失 而绘图仅包含曲线 我尝试过的两种保存方法是 在 Rstudio 中 从图像字段的下拉菜单中选择 导出 并另存为 eps
  • 如何在 bash 中转义反引号

    我很长时间以来都在试图逃避 bash 中的反引号 我尝试使用 进行转义 但它不起作用 bash 中是否可以逃避反引号 示例代码 I hello pdf var1 cat lt
  • 在 F# 中实现队列类型

    我正在尝试在 F 中实现一个队列 到目前为止 这就是我所拥有的 但我认为它的行为更像是一个堆栈 type a queue NL Que of a a queue let enque m function NL gt Que m NL Que
  • appsettings.json 中 IncludeScopes 的 JSON 验证失败

    我正在使用 ASP NET Core 2 1 为什么我得到Expression must be of type object for IncludeScopes in my appsettings json file 下面是显示警告所需的
  • window.orientation 在 iOS 和 Android 中返回不同的值

    我正在测试我的网络应用程序iPad Safari 浏览器 and 三星 Tab 2 默认浏览器 The window orientationchange在两个设备中返回不同的值 document ready function window
  • 在“docker exec”命令中执行“bash -c”

    Context 我正在尝试为我的日常使用编写一个快捷方式docker exec命令 由于某些原因 我正在尝试这样的问题 当我在容器内使用 bash 控制台时 我的输出有时会被破坏 历史记录混乱 行在我编写时相互覆盖 I read here您
  • 什么时候不应该关闭 php 文件?

    我遇到过一个教程 如果我可以添加的话 这是一个有信誉的教程 其中关闭 php 标签 gt 被省略了 这让我想起了之前的一个教程 作者说它实际上更好not关闭标签 但没有解释原因 我有点惊讶 我认为关闭标签是更好的做法 为什么最好不要关闭它
  • 如何访问类中的全局环境对象?

    我有一个类需要更新全局环境对象 我可以整天在结构之间传递该环境对象 但是如何允许类对象访问同一变量 import SwiftUI class Global ObservableObject Published var num 10 clas
  • AWS Athena (Presto)如何将映射转置为列

    AWS Athena 查询问题 我的行中有一个嵌套映射 我想将其中的键转置到列 我可以明确地命名这些列 例如items label a 但在这种情况下 键实际上是动态的 从这些行 id 1 items label a foo label b
  • 需要贵金属 API/Web 服务 [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 是否有免费的网络服务 AP
  • JavaMail 按 ReceivedDate 搜索,不能精确到秒吗?

    在 IMAP 中 邮件编号基于邮件放入文件夹的时间 即文件夹中的第一封邮件为 1 第二封邮件为 2 等等 但是 此排序不考虑消息的接收日期 我担心的是早于文件夹中的消息号 1 的消息 即由用户手动移入文件夹的消息 而不是在系统接收到消息时
  • Matplotlib,添加多行文本。添加可以跟随曲线的文本

    我已将文本添加到绘图中 在每行中进行编码 然后调整它看起来不错 增加或减少宽度 或更改位置 但是 有没有办法让 Python 知道您想要文本的位置以及如何设置它 然后我可以添加文本 Python 将计算出详细信息 例如 看看下面的图片 在图