【问题标题】:Python ASCII plots in terminal终端中的 Python ASCII 绘图
【发布时间】:2013-12-16 05:36:42
【问题描述】:

使用 Octave,我可以将数组绘制到终端,例如,使用函数 x^2 的值绘制一个数组会在我的终端中提供以下输出:

   10000 ++---------+-----------+----------+-----------+---------++
         ++         +           +          +           +         ++
         |+         :           :          :           :         +|
         |++        :           :          :           :        ++|
         | +        :           :          :           :        + |
         | ++       :           :          :           :       ++ |
    8000 ++.+..................................................+.++
         |  ++      :           :          :           :      ++  |
         |   ++     :           :          :           :     ++   |
         |    +     :           :          :           :     +    |
         |    ++    :           :          :           :    ++    |
         |     +    :           :          :           :    +     |
    6000 ++....++..........................................++....++
         |      ++  :           :          :           :  ++      |
         |       +  :           :          :           :  +       |
         |       ++ :           :          :           : ++       |
         |        ++:           :          :           :++        |
    4000 ++........++..................................++........++
         |          +           :          :           +          |
         |          ++          :          :          ++          |
         |          :++         :          :         ++:          |
         |          : ++        :          :        ++ :          |
         |          :  ++       :          :       ++  :          |
    2000 ++.............++........................++.............++
         |          :    ++     :          :     ++    :          |
         |          :     +++   :          :   +++     :          |
         |          :       ++  :          :  ++       :          |
         |          :        +++:          :+++        :          |
         +          +          ++++      ++++          +          +
       0 ++---------+-----------+----------+-----------+---------++
         0        20000       40000      60000       80000     100000

有什么方法可以在 Python 中做类似的事情,特别是使用 matplotlib? bashplotlib 似乎提供了一些这样的功能,但与 Octave 的产品相比似乎相当基本。

【问题讨论】:

  • 你介意用python控制的gnuplot吗?
  • @Jakob 我会对它的工作原理感兴趣。
  • 我没有玩过 gnuplot 的 ascii 模式,但是从这个页面看它看起来和你想要的很相似:cs.hmc.edu/~vrable/gnuplot/using-gnuplot.html 如果你想从 python 中使用 gnuplot,你可以让 python 写一个脚本文件gnuplot 然后使用 subprocess 在您刚刚编写的脚本文件上调用 gnuplot。不太优雅,但应该可以。

标签: python matplotlib


【解决方案1】:

检查包plotext,它允许直接在终端上绘制数据。它非常直观,因为它的语法与 ma​​tplotlib 非常相似。

这是一个基本的例子:

import plotext as plt
y = plt.sin() # sinusoidal signal 
plt.scatter(y)
plt.title("Scatter Plot")
plt.show()

您还可以绘制条形图

甚至是图片

此处显示了绘制连续数据流的示例:

它可以安装

pip install plotext

或与:

pip install "plotext[image]" 

将 plotext 用于图像。

【讨论】:

    【解决方案2】:

    您可以像往常一样在 matplotlib 中进行绘图并将其显示为 ascii 文本(彩色或灰色) 使用matplotlib2terminal.py

    我在终端中以非常高分辨率显示了我自己的图片,您只需将终端缩小到足够的程度。

    【讨论】:

      【解决方案3】:

      我刚刚发布了termplotlib,希望它能让你在这里的生活更轻松。对于线图,需要安装gnuplot和termplotlib,

      pip install termplotlib
      

      在此之后,只需生成线图

      import termplotlib as tpl
      import numpy
      
      x = numpy.linspace(0, 2 * numpy.pi, 10)
      y = numpy.sin(x)
      
      fig = tpl.figure()
      fig.plot(x, y, label="data", width=50, height=15)
      fig.show()
      
          1 +---------------------------------------+
        0.8 |    **     **                          |
        0.6 |   *         **           data ******* |
        0.4 | **                                    |
        0.2 |*              **                      |
          0 |                 **                    |
            |                                   *   |
       -0.2 |                   **            **    |
       -0.4 |                     **         *      |
       -0.6 |                              **       |
       -0.8 |                       **** **         |
         -1 +---------------------------------------+
            0     1    2     3     4     5    6     7
      

      【讨论】:

        【解决方案4】:

        另一种选择是drawilleplot 包。 https://github.com/gooofy/drawilleplot

        pip3 install drawilleplot
        

        我发现这是一个非常好的方法,因为您只需要更改 Matplotlib 后端即可启用它。

        import matplotlib
        matplotlib.use('module://drawilleplot')
        

        之后,就可以像往常一样使用 Matplotlib。

        这是一个来自包 README 的示例(请注意,这些图看起来比这里粘贴的要好。)

        def f(t):
            return np.exp(-t) * np.cos(2*np.pi*t)
        
        t1 = np.arange(0.0, 5.0, 0.1)
        t2 = np.arange(0.0, 5.0, 0.02)
        
        plt.figure()
        plt.subplot(211)
        plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')
        
        plt.subplot(212)
        plt.plot(t2, np.cos(2*np.pi*t2), 'r--')
        plt.show()
        
        plt.close()
        
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡖⠖⠲⢖⣶⠲⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠲⠲⡄
        ⠀⠀⠀1.0⠀⠀⠉⡇⠀⠀⠘⢿⡃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⢾⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠤⡇⠀⠀⠀⠀⠀⢹⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀0.5⠀⠀⠀⡇⠀⠀⠀⠀⠀⠘⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣴⣶⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⠿⠋⠉⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⢹⡅⠀⠀⠀⠀⠀⠀⠀⠀⣴⣧⠀⠀⠀⠀⠹⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣤⣶⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⢀⡇⠀⠀⠀⠀⠀⠀⠀⣇⠀⠀⠀⠀⠀⠀⠀⢀⡟⠁⠀⠀⠀⠀⠘⠿⡇⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⠛⠉⠉⠛⢻⣶⣆⣀⠀⠀⠀⠀⠀⢀⣀⣴⣴⣶⣶⣷⣶⣦⣤⣄⣄⣀⡀⣀⠀⣀⣀⣄⣤⣤⣶⣤⣦⣤⣤⣤⣄⣤⣀⣀⣠⣀⣀⣠⣄⣤⣤⣤⣀⠀⠀⠀⠀⡇
        ⠀⠀⠀0.0⠀⠀⠈⡇⠀⠀⠀⠀⠀⠀⠀⢻⠀⠀⠀⠀⠀⠀⠀⣼⠁⠀⠀⠀⠀⠀⠀⠀⢹⣶⡄⠀⠀⠀⠀⣾⣿⠀⠀⠀⠀⠀⠀⠀⠉⠹⠿⣷⣶⣶⣶⣿⡿⠿⠉⠁⠉⠀⠀⠈⠉⠛⠙⠟⠻⠿⠿⠟⠿⠛⠟⠙⠋⠉⠉⠋⠙⠋⠛⠙⠛⠻⠟⠻⠛⠿⠛⠛⠛⠋⠛⠁⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⢘⣧⡀⠀⠀⠀⠀⢺⡿⠂⠀⠀⠀⠀⠀⠀⠀⠈⠙⣷⣦⣤⣼⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠁⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠘⢿⠃⠀⠀⠀⠀⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠛⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠘⡇⠀⠀⢀⣼⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        −0.5⠀⠀⠀⠀⠰⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⣽⣦⠀⣸⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⠷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠋⠟⠙⠉⠉⠉⠉⠉⠉⠛⠋⠉⠉⠉⠉⠉⠉⠋⠟⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠋⠟⠙⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠙⠏⠋⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠋⠟⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠙⠙⠏⠋⠉⠉⠁
        
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀0⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀1⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀2⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀3⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀4⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀5
        ⠀⠀⠀⠀⠀⠀⠀⠀⢀⡖⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⡒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⡒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⡆
        ⠀⠀⠀1.0⠀⠀⠉⡇⠀⠀⠀⠙⢂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠌⠉⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠊⠘⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠆⠙⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠋⠑⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠆⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠘⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡌⠀⠀⠠⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡚⠀⠀⠸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡖⠀⠀⠈⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡌⠀⠀⠰⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠞⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⢓⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠁⠀⠀⠀⢤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢘⠃⠀⠀⠀⠳⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⠀⠀⠀⠀⢡⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢈⠁⠀⠀⠀⢦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⠁⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠤⡇⠀⠀⠀⠀⠀⠘⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡌⠀⠀⠀⠀⠠⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡛⠀⠀⠀⠀⠸⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡖⠀⠀⠀⠀⢈⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡉⠀⠀⠀⠀⠰⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠏⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀0.5⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⢃⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠅⠀⠀⠀⠀⠀⣤⠀⠀⠀⠀⠀⠀⠀⠀⠀⢐⠃⠀⠀⠀⠀⠀⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⠆⠀⠀⠀⠀⠀⣁⠀⠀⠀⠀⠀⠀⠀⠀⠀⢈⠁⠀⠀⠀⠀⠀⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠰⠃⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⢘⡀⠀⠀⠀⠀⠀⠀⠀⠀⣬⠀⠀⠀⠀⠀⠀⢠⡀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠀⠀⠀⠀⠀⠀⠸⠀⠀⠀⠀⠀⠀⠀⠀⠀⡴⠀⠀⠀⠀⠀⠀⢈⠀⠀⠀⠀⠀⠀⠀⠀⠀⡈⠀⠀⠀⠀⠀⠀⢰⠀⠀⠀⠀⠀⠀⠀⠀⠀⠾⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠈⡃⠀⠀⠀⠀⠀⠀⠀⢀⡅⠀⠀⠀⠀⠀⠀⠀⡄⠀⠀⠀⠀⠀⠀⠀⠀⠃⠀⠀⠀⠀⠀⠀⠈⠇⠀⠀⠀⠀⠀⠀⠀⢀⡆⠀⠀⠀⠀⠀⠀⠈⡁⠀⠀⠀⠀⠀⠀⠀⢀⡃⠀⠀⠀⠀⠀⠀⠐⡆⠀⠀⠀⠀⠀⠀⠀⠠⠇⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀0.0⠀⠀⠘⡇⠀⠀⠀⠀⠀⠀⠀⢛⠀⠀⠀⠀⠀⠀⠀⢨⠁⠀⠀⠀⠀⠀⠀⠀⢠⠀⠀⠀⠀⠀⠀⠀⠘⠁⠀⠀⠀⠀⠀⠀⠀⠳⠀⠀⠀⠀⠀⠀⠀⢰⠀⠀⠀⠀⠀⠀⠀⠀⢁⠀⠀⠀⠀⠀⠀⠀⢘⠀⠀⠀⠀⠀⠀⠀⠀⢶⠀⠀⠀⠀⠀⠀⠀⠸⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠘⡂⠀⠀⠀⠀⠀⠀⡌⠀⠀⠀⠀⠀⠀⠀⠀⠨⡄⠀⠀⠀⠀⠀⠀⠛⠀⠀⠀⠀⠀⠀⠀⠀⠸⠄⠀⠀⠀⠀⠀⠀⡆⠀⠀⠀⠀⠀⠀⠀⠀⢘⡀⠀⠀⠀⠀⠀⠀⡋⠀⠀⠀⠀⠀⠀⠀⠀⢰⡄⠀⠀⠀⠀⠀⠀⠖⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠃⠀⠀⠀⠀⠀⢠⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⣅⠀⠀⠀⠀⠀⠐⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠇⠀⠀⠀⠀⠀⢠⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⣃⠀⠀⠀⠀⠀⢀⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⣆⠀⠀⠀⠀⠀⠰⠆⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⢠⡇⠀⠀⠀⠀⠀⠀⠀⠀⠘⠀⠀⠀⠀⠀⣨⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢨⡀⠀⠀⠀⠀⠸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⠀⠀⠀⠀⠀⣴⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢙⠀⠀⠀⠀⠀⡘⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⠀⠀⠀⠀⠀⠴⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        −0.5⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠈⠃⠀⠀⠀⢀⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡅⠀⠀⠀⠀⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠇⠀⠀⠀⢀⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡃⠀⠀⠀⢀⡃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡆⠀⠀⠀⠠⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠀⠀⠀⣨⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢩⡀⠀⠀⠸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠰⠀⠀⠀⣴⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢙⠀⠀⠀⡘⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⠀⠀⠀⠴⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢃⠀⢠⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢥⠀⠰⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠧⠀⢠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢃⠀⣀⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢦⠀⠰⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
        −1.0⠀⠀⠀⠀⠲⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠓⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠐⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠓⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠁⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠚⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡇
        ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠋⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠋⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠋⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠋⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠋⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠋⠉⠉⠉
        

        在大约 100 个字符宽的终端中,绘图看起来非常漂亮

        【讨论】:

        • 正是我想要的。在 ssh 会话期间通过更改一行代码来获得粗略的绘图很有用。
        【解决方案5】:

        另请参阅:asciichart(在 Node.js、Python、Java、Go 和 Haskell 中实现)

        【讨论】:

          【解决方案6】:

          由于已经很少有答案表明gnuplot 是一个不错的选择。

          但是,不需要调用 gnuplot 子进程,使用 python gnuplotlib 库可能会容易得多。

          示例(来自:https://github.com/dkogan/gnuplotlib):

          >>> import numpy as np
          >>> import gnuplotlib as gp
          
          >>> x = np.linspace(-5,5,100)
          
          >>> gp.plot( x, np.sin(x) )
          [ graphical plot pops up showing a simple sinusoid ]
          
          
          >>> gp.plot( (x, np.sin(x), {'with': 'boxes'}),
          ...          (x, np.cos(x), {'legend': 'cosine'}),
          
          ...          _with    = 'lines',
          ...          terminal = 'dumb 80,40',
          ...          unset    = 'grid')
          
          [ ascii plot printed on STDOUT]
             1 +-+---------+----------+-----------+-----------+----------+---------+-+
               +     +|||+ +          +         +++++   +++|||+          +           +
               |     |||||+                    +     +  +||||||       cosine +-----+ |
           0.8 +-+   ||||||                    +     + ++||||||+                   +-+
               |     ||||||+                  +       ++||||||||+                    |
               |     |||||||                  +       ++|||||||||                    |
               |     |||||||+                +        |||||||||||                    |
           0.6 +-+   ||||||||               +         +||||||||||+                 +-+
               |     ||||||||+              |        ++|||||||||||                   |
               |     |||||||||              +        |||||||||||||                   |
           0.4 +-+   |||||||||              |       ++||||||||||||+                +-+
               |     |||||||||             +        +||||||||||||||                  |
               |     |||||||||+            +        |||||||||||||||                  |
               |     ||||||||||+           |       ++||||||||||||||+           +     |
           0.2 +-+   |||||||||||          +        |||||||||||||||||           +   +-+
               |     |||||||||||          |        +||||||||||||||||+          |     |
               |     |||||||||||         +         ||||||||||||||||||         +      |
             0 +-+   +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++   +-+
               |       +        ||||||||||||||||||+         |       ++||||||||||     |
               |       |        +|||||||||||||||||          +        |||||||||||     |
               |       +        ++||||||||||||||||          |        +||||||||||     |
          -0.2 +-+      +        |||||||||||||||||          +        |||||||||||   +-+
               |        |        ++||||||||||||||+           |       ++|||||||||     |
               |        +         |||||||||||||||            +        ++||||||||     |
               |         |        +||||||||||||||            +         |||||||||     |
          -0.4 +-+       +        ++||||||||||||+             |        +||||||||   +-+
               |          +        |||||||||||||              +        |||||||||     |
               |          |        +|||||||||||+               +       ++|||||||     |
          -0.6 +-+        +        ++||||||||||                |        +|||||||   +-+
               |           +        |||||||||||                +        ++||||||     |
               |           +        +|||||||||+                 +        |||||||     |
               |            +       ++||||||||                  +       +++|||||     |
          -0.8 +-+          +      + ++||||||+                   +      + +|||||   +-+
               |             +    +   +||||||                     +    +  ++||||     |
               +           +  +  ++   ++|||++     +           +   ++  +  + ++|||     +
            -1 +-+---------+----------+-----------+-----------+----------+---------+-+
              -6          -4         -2           0           2          4           6
          

          【讨论】:

            【解决方案7】:

            如果您只需要快速概览并且您的 x 轴是等距的,您也可以自己制作一些快速的 ascii 输出。

            In [1]: y = [20, 26, 32, 37, 39, 40, 38, 35, 30, 23, 17, 10,  5,  2,  0,  1,  3,
               ....:         8, 14, 20]
            
            In [2]: [' '*(d-1) + '*' for d in y]
            Out[2]: 
            ['                   *',
             '                         *',
             '                               *',
             '                                    *',
             '                                      *',
             '                                       *',
             '                                     *',
             '                                  *',
             '                             *',
             '                      *',
             '                *',
             '         *',
             '    *',
             ' *',
             '*',
             '*',
             '  *',
             '       *',
             '             *',
             '                   *']
            

            如果您的y-data 不是整数,请对它们进行偏移和缩放,使它们处于有效范围内。比如上面的数字基本都是( sin(x)+1 )*20

            【讨论】:

            • 这让我想起了我的第一个 C++ 课程绘制钻石:D
            【解决方案8】:

            您也可以尝试 Sympy 的 TextBackend 的绘图,请参阅 doc。或者直接使用textplot

            这是一个例子

            from sympy import symbols
            from sympy.plotting import textplot
            x = symbols('x')
            textplot(x**2,0,5)
            

            输出

            24.0992 |                                                      / 
                    |                                                    ..  
                    |                                                   /    
                    |                                                 ..     
                    |                                               ..       
                    |                                              /         
                    |                                            ..          
                    |                                          ..            
            12.0496 | ---------------------------------------..--------------
                    |                                     ...                
                    |                                   ..                   
                    |                                 ..                     
                    |                              ...                       
                    |                           ...                          
                    |                        ...                             
                    |                   .....                                
                    |              .....                                     
                  0 | .............                                          
                      0                      2.5                        5    
            

            【讨论】:

            • 这很好,但是我如何用这个(或任意值列表)而不是参数函数来绘制时间序列? sympy/texplot 支持这种东西吗?
            • 我不知道,我从来没有用过那种方式。可能有一种解决方法定义了一个函数,该函数将一个具有“时间序列”的值返回。
            【解决方案9】:

            正如@Benjamin Barenblat 指出的那样,目前没有办法使用 matplotlib。如果你真的想使用纯 python 库,可以查看ASCII Plotter。但是,正如我上面评论的那样,我会按照建议使用gnuplot,例如在this 问题中。

            要直接从 python 使用 gnuplot,您可以使用 Gnuplot.py(我还没有测试过)或使用带有脚本界面的 gnuplot。后者可以实现(如建议here),如:

            import numpy as np
            x=np.linspace(0,2*np.pi,10)
            y=np.sin(x)
            import subprocess
            gnuplot = subprocess.Popen(["/usr/bin/gnuplot"], 
                                       stdin=subprocess.PIPE)
            gnuplot.stdin.write("set term dumb 79 25\n")
            gnuplot.stdin.write("plot '-' using 1:2 title 'Line1' with linespoints \n")
            for i,j in zip(x,y):
               gnuplot.stdin.write("%f %f\n" % (i,j))
            gnuplot.stdin.write("e\n")
            gnuplot.stdin.flush()
            

            这给出了一个类似的情节

                1 ++--------+---A******---------+--------+---------+---------+--------++
                  +         + **      +A*       +        +         +      Line1 **A*** +
              0.8 ++        **           *                                            ++
                  |       **              **                                           |
              0.6 ++     A                  *                                         ++
                  |     *                    *                                         |
              0.4 ++   *                                                              ++
                  |  **                       A                                        |
              0.2 ++*                          *                                      ++
                  |*                            *                                      |
                0 A+                             *                              A     ++
                  |                               *                            *       |
             -0.2 ++                               *                          *       ++
                  |                                 A*                      **         |
             -0.4 ++                                  *                    *          ++
                  |                                    **                 *            |
             -0.6 ++                                     *               A            ++
                  |                                       *            **              |
             -0.8 ++                                                 **               ++
                  +         +         +         +        + A****** **        +         +
               -1 ++--------+---------+---------+--------+--------A+---------+--------++
                  0         1         2         3        4         5         6         7
            

            可以找到一些样式选项,例如here.

            【讨论】:

            • 最后一行应替换为:gnuplot.stdin.write("exit\n"); gnuplot.stdin.flush(); gnuplot.wait()
            • 在 Python 3 中,需要将传递给 gnuplot.stdin 的字符串包装在 bytes 中,如下所示:gnuplot.stdin.write(bytes("set term dumb 79 25\n", "utf-8"))
            • 您也可以只使用gnuplot.stdin.write(b"set term dumb 79 25\n") 将字符串编码为字节——在 MacOS High Sierra 10.3.3 中使用交互式 Ipython 终端和 Python 3.6 进行了测试。
            【解决方案10】:

            如果您受限于 matplotlib,目前的答案是否定的。目前matplotlib有很多backends,但ASCII不是其中之一。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-07-27
              • 1970-01-01
              • 2016-06-06
              • 2016-09-14
              • 2018-03-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多