baj*_*ife 131 unix charts graph matplotlib
那里有一个很好的命令行UNIX图表/图形/绘图工具吗?我正在寻找能在ASCII图上绘制xy点的东西.
只是为了澄清,我正在寻找能够输出ASCII图形的东西(如ascii-art样式),所以我可以在交互式shell会话中使用它而不需要X.
Pal*_*min 127
试试gnuplot.它具有非常强大的图形可能性.
它可以通过以下方式输出到您的终端:
gnuplot> set terminal dumb
Terminal type set to 'dumb'
Options are 'feed 79 24'
gnuplot> plot sin(x)
1 ++----------------**---------------+----**-----------+--------**-----++
+ *+ * + * * + sin(x) ****** +
0.8 ++ * * * * * * ++
| * * * * * * |
0.6 ++ * * * * * * ++
* * * * * * * |
0.4 +* * * * * * * ++
|* * * * * * * |
0.2 +* * * * * * * ++
| * * * * * * * |
0 ++* * * * * * *++
| * * * * * * *|
-0.2 ++ * * * * * * *+
| * * * * * * *|
-0.4 ++ * * * * * * *+
| * * * * * * *
-0.6 ++ * * * * * * ++
| * * * * * * |
-0.8 ++ * * * * * * ++
+ * * + * * + * * +
-1 ++-----**---------+----------**----+---------------**+---------------++
-10 -5 0 5 10
Run Code Online (Sandbox Code Playgroud)
Xio*_*iov 64
虽然gnuplot功能强大,但当你想要在一堆点中输入并获得图表时,它也会非常恼人.
值得庆幸的是,有人创建了eplot(简单的情节),它可以为你处理所有废话.
它似乎没有强制终端图的选项; 我修补它是这样的:
--- eplot.orig 2012-10-12 17:07:35.000000000 -0700
+++ eplot 2012-10-12 17:09:06.000000000 -0700
@@ -377,6 +377,7 @@
# ---- print the options
com="echo '\n"+getStyleString+@oc["MiscOptions"]
com=com+"set multiplot;\n" if doMultiPlot
+ com=com+"set terminal dumb;\n"
com=com+"plot "+@oc["Range"]+comString+"\n'| gnuplot -persist"
printAndRun(com)
# ---- convert to PDF
Run Code Online (Sandbox Code Playgroud)
使用示例:
[$]> git shortlog -s -n | awk '{print $1}' | eplot 2> /dev/null
3500 ++-------+-------+--------+--------+-------+--------+-------+-------++
+ + + "/tmp/eplot20121012-19078-fw3txm-0" ****** + * | 3000 +* ++ |* | | * | 2500 ++* ++ | * |
| * |
2000 ++ * ++
| ** |
1500 ++ **** ++
| * |
| ** |
1000 ++ * ++
| * |
| * |
500 ++ *** ++
| ************** |
+ + + + ********** + + + +
0 ++-------+-------+--------+--------+-----***************************++
0 5 10 15 20 25 30 35 40
Run Code Online (Sandbox Code Playgroud)
Xio*_*iov 24
我刚遇到的另一个选择是bashplotlib.这是一个示例(大致)与我的eplot示例相同的数据运行:
[$]> git shortlog -s -n | awk '{print $1}' | hist
33| o
32| o
30| o
28| o
27| o
25| o
23| o
22| o
20| o
18| o
16| o
15| o
13| o
11| o
10| o
8| o
6| o
5| o
3| o o o
1| o o o o o
0| o o o o o o o
----------------------
-----------------------
| Summary |
-----------------------
| observations: 50 |
| min value: 1.000000 |
| mean : 519.140000 |
|max value: 3207.000000|
-----------------------
Run Code Online (Sandbox Code Playgroud)
调整垃圾箱有助于提高分辨率:
[$]> git shortlog -s -n | awk '{print $1}' | hist --nosummary --bins=40
18| o
| o
17| o
16| o
15| o
14| o
13| o
12| o
11| o
10| o
9| o
8| o
7| o
6| o
5| o o
4| o o o
3| o o o o o
2| o o o o o
1| o o o o o o o
0| o o o o o o o o o o o o o
| o o o o o o o o o o o o o
--------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
den*_*nis 18
单行中的绘图非常简单,可以帮助人们看到高点和低点的模式.
另见pysparklines.
(有没有人知道unicode斜线,它们可以组合在一起制作线条,而不是条形图,情节?)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division
import numpy as np
__version__ = "2015-01-02 jan denis"
#...............................................................................
def onelineplot( x, chars=u"????????", sep=" " ):
""" numbers -> v simple one-line plots like
f ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? osc 47 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? rosenbrock
f ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? osc 58 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? rastrigin
f ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? osc 90 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ackley
Usage:
astring = onelineplot( numbers [optional chars= sep= ])
In:
x: a list / tuple / numpy 1d array of numbers
chars: plot characters, default the 8 Unicode bars above
sep: "" or " " between plot chars
How it works:
linscale x -> ints 0 1 2 3 ... -> chars ? ? ? ? ...
See also: https://github.com/RedKrieg/pysparklines
"""
xlin = _linscale( x, to=[-.49, len(chars) - 1 + .49 ])
# or quartiles 0 - 25 - 50 - 75 - 100
xints = xlin.round().astype(int)
assert xints.ndim == 1, xints.shape # todo: 2d
return sep.join([ chars[j] for j in xints ])
def _linscale( x, from_=None, to=[0,1] ):
""" scale x from_ -> to, default min, max -> 0, 1 """
x = np.asanyarray(x)
m, M = from_ if from_ is not None \
else [np.nanmin(x), np.nanmax(x)]
if m == M:
return np.ones_like(x) * np.mean( to )
return (x - m) * (to[1] - to[0]) \
/ (M - m) + to[0]
#...............................................................................
if __name__ == "__main__": # standalone test --
import sys
if len(sys.argv) > 1: # numbers on the command line, may be $(cat myfile)
x = map( float, sys.argv[1:] )
else:
np.random.seed( 0 )
x = np.random.exponential( size=20 )
print onelineplot( x )
Run Code Online (Sandbox Code Playgroud)
mc0*_*c0e 17
feedgnuplot是gnuplot的另一个前端,它处理数据中的管道.
$ seq 5 | awk '{print 2*$1, $1*$1}' |
feedgnuplot --lines --points --legend 0 "data 0" --title "Test plot" --y2 1
--terminal 'dumb 80,40' --exit
Test plot
10 ++------+--------+-------+-------+-------+--------+-------+------*A 25
+ + + + + + + + **#+
| : : : : : : data 0+**A*** |
| : : : : : : :** # |
9 ++.......................................................**.##....|
| : : : : : : ** :# |
| : : : : : : ** # |
| : : : : : :** ##: ++ 20
8 ++................................................A....#..........|
| : : : : : **: # : |
| : : : : : ** : ## : |
| : : : : : ** :# : |
| : : : : :** B : |
7 ++......................................**......##................|
| : : : : ** : ## : : ++ 15
| : : : : ** : # : : |
| : : : :** : ## : : |
6 ++..............................*A.......##.......................|
| : : : ** : ##: : : |
| : : : ** : # : : : |
| : : :** : ## : : : ++ 10
5 ++......................**........##..............................|
| : : ** : #B : : : |
| : : ** : ## : : : : |
| : :** : ## : : : : |
4 ++...............A.......###......................................|
| : **: ##: : : : : |
| : ** : ## : : : : : ++ 5
| : ** : ## : : : : : |
| :** ##B# : : : : : |
3 ++.....**..####...................................................|
| **#### : : : : : : |
| **## : : : : : : : |
B** + + + + + + + +
2 A+------+--------+-------+-------+-------+--------+-------+------++ 0
1 1.5 2 2.5 3 3.5 4 4.5 5
Run Code Online (Sandbox Code Playgroud)
Igo*_*tor 11
另请参见:asciichart(在Node.js,Python,Java,Go和Haskell中实现)
检查允许使用 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)的扩展。如果您在使用时遇到任何问题,请告诉我。谢谢。
我希望这能解决你的问题。
您应该使用gnuplot,并确保在启动后发出命令“ set term dumb”。您还可以给出行数和列数。如果发出“ set term dumb 64 10”,然后发出“ plot sin(x)”,则这是gnuplot的输出:
1 ++ ----------- **** ----------- +-*** ------- + ------ * ***-++
0.6 * + ** + * + ** * sin(x)******* ++
0.2 + * * * ** ** * ** ++
0 ++ * ** * ** * ** * ++
-0.4 ++ ** * ** ** * * * +
-0.8 ++ ** * + * ** + * + ** + *
-1 ++-**** ------ + ------- *** --- + ---------- **** ----- ------ ++
-10 -5 0 5 10
在79x24时看起来更好(不要在80x24的显示屏上使用第80列:某些curses实现在最后一列周围的表现并不总是很好)。
我正在使用gnuplot v4,但是这应该在稍旧或较新的版本上有效。
gnuplot 的另一个更简单/更轻量级的替代品是ervy,这是一种基于NodeJS的终端图表工具。
支持的类型:散点图(XY 点)、条形图、饼图、子弹、甜甜圈和仪表。
可以在项目GitHub 存储库中找到具有各种选项的使用示例