终端中的Python ASCII图

Mik*_*lla 32 python matplotlib

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

   10000 ++---------+-----------+----------+-----------+---------++
         ++         +           +          +           +         ++
         |+         :           :          :           :         +|
         |++        :           :          :           :        ++|
         | +        :           :          :           :        + |
         | ++       :           :          :           :       ++ |
    8000 ++.+..................................................+.++
         |  ++      :           :          :           :      ++  |
         |   ++     :           :          :           :     ++   |
         |    +     :           :          :           :     +    |
         |    ++    :           :          :           :    ++    |
         |     +    :           :          :           :    +     |
    6000 ++....++..........................................++....++
         |      ++  :           :          :           :  ++      |
         |       +  :           :          :           :  +       |
         |       ++ :           :          :           : ++       |
         |        ++:           :          :           :++        |
    4000 ++........++..................................++........++
         |          +           :          :           +          |
         |          ++          :          :          ++          |
         |          :++         :          :         ++:          |
         |          : ++        :          :        ++ :          |
         |          :  ++       :          :       ++  :          |
    2000 ++.............++........................++.............++
         |          :    ++     :          :     ++    :          |
         |          :     +++   :          :   +++     :          |
         |          :       ++  :          :  ++       :          |
         |          :        +++:          :+++        :          |
         +          +          ++++      ++++          +          +
       0 ++---------+-----------+----------+-----------+---------++
         0        20000       40000      60000       80000     100000
Run Code Online (Sandbox Code Playgroud)

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

Jak*_*kob 20

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

要直接从python使用gnuplot你可以使用Gnuplot.py(我还没有测试过)或者使用gnuplot和脚本界面.后者可以实现(如此处所示),如:

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()
Run Code Online (Sandbox Code Playgroud)

这给出了一个类似的情节

    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
Run Code Online (Sandbox Code Playgroud)

一些造型选项可以在这里找到.

  • 在 Python 3 中,需要将传递给 `gnuplot.stdin` 的字符串包装在 *bytes* 中,如下所示: `gnuplot.stdin.write(bytes("set term mud 79 25\n", "utf-8" ))` (2认同)

nic*_*aro 17

你也可以试试Sympy的TextBackend情节,参见doc.或者只是使用textplot.

这是一个例子

from sympy import symbols
from sympy.plotting import textplot
x = symbols('x')
textplot(x**2,0,5)
Run Code Online (Sandbox Code Playgroud)

与输出

24.0992 |                                                      / 
        |                                                    ..  
        |                                                   /    
        |                                                 ..     
        |                                               ..       
        |                                              /         
        |                                            ..          
        |                                          ..            
12.0496 | ---------------------------------------..--------------
        |                                     ...                
        |                                   ..                   
        |                                 ..                     
        |                              ...                       
        |                           ...                          
        |                        ...                             
        |                   .....                                
        |              .....                                     
      0 | .............                                          
          0                      2.5                        5    
Run Code Online (Sandbox Code Playgroud)


Dat*_*eek 12

很少有答案已经表明这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
Run Code Online (Sandbox Code Playgroud)


j08*_*lue 10

如果您只需要快速浏览并且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]: 
['                   *',
 '                         *',
 '                               *',
 '                                    *',
 '                                      *',
 '                                       *',
 '                                     *',
 '                                  *',
 '                             *',
 '                      *',
 '                *',
 '         *',
 '    *',
 ' *',
 '*',
 '*',
 '  *',
 '       *',
 '             *',
 '                   *']
Run Code Online (Sandbox Code Playgroud)

如果您的y-data不是整数,则偏移并缩放它们,使它们处于可行的范围内.例如,上述数字基本上是( sin(x)+1 )*20.


Nic*_*mer 9

我刚刚发布了asciiplotlib,希望能让你的生活更轻松.对于线图,您需要安装gnuplot和asciiplotlib,

pip3 install termplotlib --user
Run Code Online (Sandbox Code Playgroud)

在此之后,生成线图

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()
Run Code Online (Sandbox Code Playgroud)
    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
Run Code Online (Sandbox Code Playgroud)


Sav*_*omo 7

检查允许使用 python3 在终端上直接绘制数据的包plotext。它非常直观,因为它的使用与matplotlib包非常相似。

这是一个基本示例:

在此处输入图片说明

您可以使用以下命令安装它:

sudo -H pip install plotext
Run Code Online (Sandbox Code Playgroud)

至于 matplotlib,主要功能是scatter(对于单点)、plot(对于由线连接的点)和show(在终端上实际打印绘图)。很容易指定绘图尺寸、点和线样式,以及任何显示轴、数字刻度和最终方程的内容,用于将绘制的坐标转换为原始实数值。

这是生成上面显示的图的代码:

import plotext.plot as plx
import numpy as np

l=3000
x=np.arange(0, l)
y=np.sin(4*np.pi/l*np.array(x))*np.exp(-0.5*np.pi/l*x)

plx.scatter(x, y, rows = 17, cols = 70)
plx.show(clear = 0)
Run Code Online (Sandbox Code Playgroud)

clear=True里面的选项show用于在绘图前清除终端:这很有用,例如,在绘制连续的数据流时。绘制连续数据流的示例如下所示: 在此处输入图片说明

包的描述提供了关于如何自定义情节的更多信息。该软件包已在 Ubuntu 16 上进行了测试,可以完美运行。未来可能的发展(根据要求)可能涉及对 Python2 和其他图形界面(例如 Jupiter)的扩展。


小智 6

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

pip3 install drawilleplot
Run Code Online (Sandbox Code Playgroud)

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

import matplotlib
matplotlib.use('module://drawilleplot')
Run Code Online (Sandbox Code Playgroud)

之后,可以像往常一样使用 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()
Run Code Online (Sandbox Code Playgroud)
???????????????????????????????????????????????????????????????????????????????????????????????????????
???1.0?????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???0.5?????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???0.0?????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
?0.5???????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????

????????????0????????????????1????????????????2????????????????3????????????????4????????????????5
???????????????????????????????????????????????????????????????????????????????????????????????????????
???1.0?????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???0.5?????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???0.0?????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
?0.5???????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
?1.0???????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

在大约 100 个字符宽的终端中,情节看起来非常好


Abd*_*oor 6

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

我在终端中以非常高分辨率显示了我自己的图片,您只需要缩小终端即可。 它在终端给我上了色


Ben*_*lat 5

如果你受限于matplotlib,答案目前是否定的.目前,matplotlib有许多后端,但ASCII不是其中之一.


Igo*_*tor 5

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

在此处输入图片说明 在此处输入图片说明