tammoippen / plotille Goto Github PK
View Code? Open in Web Editor NEWPlot in the terminal using braille dots.
License: MIT License
Plot in the terminal using braille dots.
License: MIT License
Drawing arbitrary vertical or horizontal lines on plot (scatter plots or histograms) is generally very useful, something analogous to this in matplotlib.
As far as I can see, there is no option to use a log scale in graphs using plot(). Is there a workaround for this? Best
Imagine we have a plot and have x values that look like this: 100000000011000013551 or like this 130141414.0001401212401. We don't want to print them like this but we do want to provide these values to our graph. It would be cool to be able to pass in a transformation function that would be executed for each label to transform these values to, for instance, 1E20 + 13551 or maybe even more human readable formats such as "2h ago", "1h ago".
Currently, graphing big values with plotille will lead to completely unreadable labels next to the plot.
def tick(min, max, axis=None):
"""
trying to mimic a stock market ticker
"""
if axis == "X":
return datetime.datetime.now().strftime("%H:%M:%S")
else:
min = int(min)
max = 100
return randint(min, max)
def main():
X = []
Y = []
fig = plt.Figure()
fig.plot(X, Y)
fig.set_x_limits(min_=0)
fig.set_y_limits(min_=0, max_=100)
while True:
fig.x_ticks_fkt = partial(tick, axis="X")
fig.y_ticks_fkt = partial(tick)
__import__('time').sleep(1)
print(fig.show())
if __name__ == '__main__':
main()
honestly i was surprised by the end result. i just a have an incoming ticker which has a changing price and datetime.seconds. i want just to append it to the x axis and show the new y value (price of the stock). can you please help me.
I would like to plot a list of datetimes but the problem is that I currently have to convert them to unix timestamps because this library does not support straight printing of datetimes. Now the problem with that is that timestamps tend to become quite large (and are also hard to read for humans). Can you implement time series plotting of lists of datetimes?
Negative values in histogram sometimes seem to lead to negative bin indices that can underflow (and shouldnt be there in the first place).
I believe the fix is in plotille/_util in hist() around line 85
to change the computation of x_idx to
x_idx = max(min(bins - 1, int(delta // xwidth)), 0)
(the max
is new). Alas I don't have time to thoroughly test and/or create a PR right now, maybe someone else can pick it up
Hi! I found this package very useful, thank you!
There is one thing I actually try to figure out without any success.
How do I print two plots side-by-side, I mean like 🖼️ 🖼️
Here is my code, but I have no success in making all lines same length:(
import os, sys
import plotille
import numpy as np
x = np.linspace(0, 1, 100)
y = 2*x
plot1 = plotille.plot(x, y,
lc='red', height=5, width=40, X_label='x', Y_label='T',
x_min=0, x_max=1, y_min=np.min(y), y_max=np.max(y))
y = np.exp(-x)
plot2 = plotille.plot(x, y,
lc='green', height=5, width=40, X_label='t', Y_label='T',
x_min=0, x_max=1, y_min=np.min(y), y_max=np.max(y))
print(plot1)
print(plot2)
plot = (os.linesep).join(l1.ljust(60) + l2.ljust(60) for (l1, l2) in zip(plot1.split(os.linesep), plot2.split(os.linesep)))
print(plot)
Could you please provide a command-line entry point ?
Other similar libs (termgraph
, bashplotlib
, diagram
) provide one, and it is very handy to draw a scatterplot / histogram in terminal from comma or space separated data in stdin
.
I am looking at plotting some OHLC data as candlestick. i have done some work with matplotlib and streaming data (live quotes from stock broker) .. wondering if i would be able to do this on terminal. Reason is i dont want any graphical overload on the server.
thanks for your support.
Hi, we are trying to figure out why we are not getting hex values for the plotille results when parsing the output with hd
on a terminal, do you know why this might happen ?
example :
I plot, setting all lines to 4bit "names" / "bright-green" the output on the terminal is correct, with all lines in green.
But when I parse it with hd I get no color code in hex :
echo ⢀⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⢰⠃⡎⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ | hd
00000000 e2 a2 80 e2 a1 8f e2 a0 80 e2 a0 80 e2 a0 80 e2 |................|
00000010 a0 80 e2 a0 80 e2 a0 80 e2 a0 80 e2 a0 80 e2 a0 |................|
00000020 80 e2 a0 80 e2 a0 80 e2 a0 80 e2 a0 80 e2 a1 87 |................|
00000030 e2 a0 80 e2 a0 80 e2 a2 b0 e2 a0 83 e2 a1 8e e2 |................|
00000040 a0 80 e2 a0 80 e2 a0 80 e2 a0 80 e2 a0 80 e2 a0 |................|
00000050 80 e2 a0 80 e2 a0 80 e2 a0 80 e2 a0 80 0a |..............|
0000005e
do you know why this happens ?
Hey everyone!
first of all, thank you all for working on plotille, that is a very nice library!
I am trying to have a real time chart, but I am having some hard time trying to figure out how to have the time in the x axis.
This is my initial code: https://github.com/osl-incubator/sugar/blob/main/src/sugar/plugins/stats.py#L94
but now I am trying to have the x axis with the time. and it seems it is not working properly.
as I saw in the source code it uses some math to calculate the ticks, so maybe it is breaking my code.
locally, in a wip, I tried x_ticks_fkt and register_label_formatter .. but it seems it is not working as I expected.
could you point me to any example that uses x axis for time? that I could use it for a real time chart?
another extra question, still about real time chart, do I need to create the figure for every iteration?
because if I use plot
every time, it add more lines to the chart. so for now I am recreating the chart figure every time, but it would be nice to just update the data there.
thanks!
Cool library! I'm trying to plot some simple data, but the result has an odd spike at 0 on the x-axis:
sys.stderr.write(plotille.plot(np.arange(len(diff)).tolist(), diff.tolist(), x_min=0, height=20, X_label="Frame #", Y_label='Lag-Time (ms)'))
(Lag-Time (ms)) ^
180.205040 |
172.148096 | ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
164.091152 | ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
156.034208 | ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
147.977264 | ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
139.920320 | ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
131.863376 | ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
123.806432 | ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
115.749488 | ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
107.692544 | ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
99.6356000 | ⡇⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⡀⠀⠀⡀⡀⠀⠀⠀⢸⢀⠀⡀⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⠀⠀⡀⠀⠀⣀⠀⣀⢀⣀⣀⠀⡀⠀⢀⢀⠀⠀⢀⣀⡀⠀⡀⠀⠀⠀⠀⠀⠀⠀
91.5786560 | ⡇⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⡇⠀⠀⡇⡇⠀⠀⠀⢸⣿⠀⡇⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⠀⠀⡇⠀⠀⣿⠀⣿⢸⣿⣿⠀⡇⠀⢸⢸⠀⠀⢸⣿⡇⠀⡇⠀⠀⠀⠀⠀⠀⠀
83.5217120 | ⡇⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⡇⠀⠀⡇⡇⠀⠀⠀⢸⣿⠀⡇⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⠀⠀⡇⠀⠀⣿⠀⣿⢸⣿⣿⠀⡇⠀⢸⢸⠀⠀⢸⣿⡇⠀⡇⠀⠀⠀⠀⠀⠀⠀
75.4647680 | ⡇⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⡇⠀⠀⡇⡇⠀⠀⠀⢸⣿⠀⡇⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⠀⠀⡇⠀⠀⣿⠀⣿⢸⣿⣿⠀⡇⠀⢸⢸⠀⠀⢸⣿⡇⠀⡇⠀⠀⠀⠀⠀⠀⠀
67.4078240 | ⡇⢀⡀⢀⢸⠀⣀⠀⢀⠀⠀⡀⢀⠀⣀⠀⡀⣀⣀⢀⣸⣀⣀⣇⣀⣀⣇⣇⣀⣀⣀⣸⣿⣀⡇⣀⢀⢀⣇⣀⣀⣀⣀⣀⣀⣀⣀⣀⣿⣿⣀⣀⣇⣀⣀⣿⡀⣿⣸⣿⣿⡀⣇⣀⣸⣸⣀⣀⣸⣿⡇⣀⣇⠀⠀⠀⠀⠀⠀⠀
59.3508800 | ⡇⢸⡇⢸⢸⠀⣿⠀⢸⠀⠀⣿⣿⡇⣿⢸⡇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣿⢸⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣿⣿⠀⠀⠀⠀⠀⠀⠀
51.2939360 | ⡇⢸⡇⢸⢸⠀⣿⠀⢸⠀⠀⣿⣿⡇⣿⢸⡇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣿⢸⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣿⣿⠀⠀⠀⠀⠀⠀⠀
43.2369920 | ⡇⢸⡇⢸⢸⠀⣿⠀⢸⠀⠀⣿⣿⡇⣿⢸⡇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣿⢸⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣿⣿⠀⠀⠀⠀⠀⠀⠀
35.1800480 | ⡇⢸⣇⢸⢸⠀⣿⢀⢸⠀⣀⣿⣿⡇⣿⣸⡇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣿⣸⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣿⣿⠀⠀⠀⠀⠀⠀⠀
27.1231040 | ⡏⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀
19.0661600 | ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-----------|-|---------|---------|---------|---------|---------|---------|---------|---------|-> (Frame #)
| 0 869.96250 1739.9250 2609.8875 3479.8500 4349.8125 5219.7750 6089.7375 6959.7000
Compared to matplotlib:
plt.plot(np.arange(len(diff)).tolist(), diff.tolist())
Is this even possible ? I was thinking on making a terminal UI based on curses to plot real time, maybe someone has already tried ?
I suggest adding treemap
as a type of graph that plotille can draw with a single utility function, akin to scatter
and hist
.
If this sounds like something that would suit the project, I'd gladly work on this, so feel free to assign the issue to me.
I have the Issue, that the y-values spread unevenly, so that I have no clue what the actual values are. Here is the output
(Usage) ^
1042 |
975 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
908 | ⠀⡖⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠁⠀⠀⠀⠀
840 | ⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
773 | ⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
706 | ⢀⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
639 | ⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
571 | ⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
504 | ⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
437 | ⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
370 | ⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
302 | ⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
235 | ⡜⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
168 | ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
101 | ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
34 | ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-----------|-|---------|---------|---------|---------|---------|-> (Time)
| 20:37:58 21:41:04 22:44:11 23:47:17 00:50:24 01:53:30
In my case I have values in Megabytes and I want to spread them over datetime objects, which works perfectly fine, but as you see, it looks like the usage in MB stagnates at 908, which is not true, because it stagnates at 945 MB.
It would be nice to have an option which makes the y-ticks around those values in a certain range.
My attempt would be to check which values appear more often and then to adjust a y-value at that point which should be something like the average of all points 5-10% of the total range .
for example [0, 10, 20, 20, 21, 25, 30, 32, 40, 44, 50]
the range is 50-0 = 50
10% of 50 is 5
for 0 and 10 nothing needs to be changed
(20+20+21+25)/4 = 21.5 , now remove those four values
(30+32)/2 = 31, same here
(40+44)/2 = 42, same here
50 stays like it is
the y-values should look like [0, 10, 21.5 , 21, 42, 50]
I think an option for this would smoothen a lot of plots
def convert(self, val):
for t, f in reversed(self.converters.items()):
> if isinstance(val, t):
E TypeError: isinstance() arg 2 must be a type or tuple of types
Figure.axvline(x, ...)
requires 0 <= x <= 1
, and it seems reasonable to assume that if the x_limits of the figure are x1, x2
the reference coordinate x is mapped to x1 + (x2 - x1) * x
. In this setting x=0
corresponds to x1
and x=1
corresponds to x2
.
In reality it seems that x=0
corresponds to the middle vertical (x1 + x2) / 2
. So -1
would correspond to the left boundary, but negative reference coordinates are forbidden!
f = plotille.Figure()
f.width = 20
f.height = 20
f.set_x_limits(-1, 1)
f.axvline(0) # would expect this to be at left boundary
print(f.show())
(Y) ^
1 |
0.95000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.90000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.85000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.80000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.75000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.70000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.65000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.60000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.55000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.50000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.45000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.40000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.35000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.30000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.25000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.20000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.15000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.10000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.05000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
0 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀
-----------|-|---------|---------|-> (X)
| -1 0 1
And likewise
In [90]: f = plotille.Figure()
...: f.width = 20
...: f.height = 20
...: f.set_x_limits(-2, 2)
...: f.axvline(0.5) # would expect this to be in center
...: print(f.show())
(Y) ^
1 |
0.95000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.90000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.85000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.80000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.75000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.70000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.65000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.60000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.55000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.50000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.45000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.40000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.35000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.30000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.25000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.20000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.15000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.10000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0.05000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
0 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀
-----------|-|---------|---------|-> (X)
| -2 0 2
>>> import plotille
>>> print(plotille.histogram([0,0,0]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/isak/.local/share/virtualenvs/mxaimbot_trainer-A7Up_mVO/lib/python3.7/site-packages/plotille/_graphs.py", line 126, in histogram
fig.histogram(X, bins, lc)
File "/home/isak/.local/share/virtualenvs/mxaimbot_trainer-A7Up_mVO/lib/python3.7/site-packages/plotille/_figure.py", line 257, in histogram
self._plots += [Histogram.create(X, bins, lc)]
File "/home/isak/.local/share/virtualenvs/mxaimbot_trainer-A7Up_mVO/lib/python3.7/site-packages/plotille/_figure.py", line 347, in create
frequencies, buckets = hist(X, bins)
File "/home/isak/.local/share/virtualenvs/mxaimbot_trainer-A7Up_mVO/lib/python3.7/site-packages/plotille/_util.py", line 82, in hist
x_idx = min(bins - 1, int(delta // xwidth))
ZeroDivisionError: float divmod()
using plotille version 3.7
First of all let me thank you for this tool. I've been using it to graph a lot of things lately, and it rocks!
Something that I've noticed in many of my graphs is that the X axis values quickly become unreadable. An example of a graph I'm seeing now:
0.00000 178.77778 357.55556 536.33333 715.11111 893.88889 1072.666671251.444441430.222221609.00000
I was wondering if it would be possible to tell plotille to just print the integer values for the X axis (without the decimal part) and set a min spacing (2 spaces maybe?) between the values.
$ python --version
Python 3.7.3
$ pip --version
pip 19.1.1 from /Users/acarlson/anaconda3/envs/colab/lib/python3.7/site-packages/pip (python 3.7)
$ pip install plotille
Collecting plotille
Downloading https://files.pythonhosted.org/packages/22/16/219daf27f7af6bec6b8f6dd1fe928e2723e4f9def04139aa5be8adea1800/plotille-3.7.tar.gz
Installing build dependencies ... error
ERROR: Complete output from command /Users/acarlson/anaconda3/envs/colab/bin/python /Users/acarlson/anaconda3/envs/colab/lib/python3.7/site-packages/pip install --ignore-installed --no-user --prefix /private/var/folders/36/xqbmrgy53cb46vvzvrln93tccvpxfl/T/pip-build-env-swclygl1/overlay --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- 'setuptools>=40.8.0' wheel:
ERROR: Traceback (most recent call last):
File "/Users/acarlson/anaconda3/envs/colab/lib/python3.7/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/Users/acarlson/anaconda3/envs/colab/lib/python3.7/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/Users/acarlson/anaconda3/envs/colab/lib/python3.7/site-packages/pip/__main__.py", line 16, in <module>
from pip._internal import main as _main # isort:skip # noqa
File "/Users/acarlson/anaconda3/envs/colab/lib/python3.7/site-packages/pip/_internal/__init__.py", line 4, in <module>
import locale
File "/Users/acarlson/anaconda3/envs/colab/lib/python3.7/locale.py", line 16, in <module>
import re
File "/Users/acarlson/anaconda3/envs/colab/lib/python3.7/re.py", line 143, in <module>
class RegexFlag(enum.IntFlag):
AttributeError: module 'enum' has no attribute 'IntFlag'
----------------------------------------
ERROR: Command "/Users/acarlson/anaconda3/envs/colab/bin/python /Users/acarlson/anaconda3/envs/colab/lib/python3.7/site-packages/pip install --ignore-installed --no-user --prefix /private/var/folders/36/xqbmrgy53cb46vvzvrln93tccvpxfl/T/pip-build-env-swclygl1/overlay --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- 'setuptools>=40.8.0' wheel" failed with error code 1 in None
I'm on MacOS Mojave v 10.14.6
Sir, I am searching for a library to draw graph in terminal and I found this library and used this, but the output is not getting as required. Please help out.
The code I used (which is given in readme of your library)
import plotille
import numpy as np
X = np.sort(np.random.normal(size=1000))
fig = plotille.Figure()
fig.width = 60
fig.height = 30
fig.set_x_limits(min_=-3, max_=3)
fig.set_y_limits(min_=-1, max_=1)
fig.color_mode = 'byte'
fig.plot([-0.5, 1], [-1, 1], lc=25, label='First line')
fig.scatter(X, np.sin(X), lc=100, label='sin')
fig.plot(X, (X+2)**2 , lc=200, label='square')
print(fig.show(legend=True))
The output what I got
The actual output (shown in read me)
Why I am getting the extra braille dots
? Please help me. Waiting for your replay.
Thank you.
Well, I've made a small library for resampling data to use on functions plot and scatter of plotille.
https://github.com/carlosplanchon/plotilleresample
"""
Rationale:
Versions:
plotille 3.6
Python 3.6.4 :: Anaconda custom (64-bit)
Windows 10 Version 1809
Environment:
Jupyter Lab Version 0.35.3
When plotting many points axes separators tend to become misaligned. Below is an example running a provided example script. This looks like a fantastic tool, would appreciate any help. Thank you.
Would you consider to support basic arrow as a start/end point of line just for convenience?
Or can we draw " -----------> " easily?
For time series plotting, python's built in datetime.datetime
class is much appreciated! However, sometimes datetime.date
is more convenient. Could these be accepted as input as well?
It would be lovely to be able to plot simple network graphs.
https://en.wikipedia.org/wiki/Network_theory
Chart size may be an issue but for small plots nodes may be constructed using icons or small colored unicode characters that may be explained in a legend...
Can't build constant plots
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.