Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Four quandrant scatter plot misalignment #21

Closed
FinFighter opened this issue Mar 31, 2019 · 7 comments
Closed

Four quandrant scatter plot misalignment #21

FinFighter opened this issue Mar 31, 2019 · 7 comments

Comments

@FinFighter
Copy link

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.

image

@tammoippen
Copy link
Owner

tammoippen commented Apr 1, 2019

Hello @FinFighter ,

Thank you for using / trying plotille. The lib was designed to be used in a terminal:

  • color output uses ANSI (and extensions) escape sequences, which are interpreted by a terminal as colors. See this wiki article for details. Also it detects, if the script is run in a tty session - if not, the escape sequences are not printed. Output would look even more ugly :D (see below)
  • in the terminal all (most) characters are printed in a grid of equal size, even if the used font uses characters that are not equal width. In most monospace fonts I tested, the braille characters are still wider than the ASCII characters. The terminal forces the characters into the grid. (BTW: the 'whitespace' within the axis are not ordinary space (ASCII 20) characters, but braille characters with no dot set: \u2800. See _dots.py for details on the handling of each character.)

Since Jupyter notebooks do not have the terminal grid formatting in the output, the braille characters misalign the output with respect to the axis.

Please try the script in the terminal:

import plotille
import numpy as np

X = np.sort(np.random.normal(size=1000))

fig = plotille.Figure()
fig.width = 60
fig.height = 3
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))

@tammoippen
Copy link
Owner

Script in an ipython session:
Screen Shot 2019-04-01 at 20 24 44

@tammoippen
Copy link
Owner

Script in my jupyter notebook. The canvas within the axis is misaligned.

Screen Shot 2019-04-01 at 20 45 45

@tammoippen
Copy link
Owner

tammoippen commented Apr 1, 2019

The output with color escape sequences printed (for fun :D). The character is the ASCII ESC character (\x1b ASCII 27):

   (Y)     ^
         1 |
0.93333333 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;200m⢠�[0m�[38;5;200m⠇�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;25m⢠�[0m�[38;5;25m⠃�[0m⠀�[38;5;100m⡠�[0m�[38;5;100m⠞�[0m�[38;5;100m⠉�[0m⠀⠀�[38;5;100m⠉�[0m�[38;5;100m⠑�[0m�[38;5;100m⢄�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.86666667 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;200m⢸�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;25m⡎�[0m�[38;5;100m⢠�[0m�[38;5;100m⠞�[0m�[38;5;100m⠁�[0m⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⠲�[0m�[38;5;100m⡀�[0m⠀⠀⠀⠀⠀⠀⠀⠀
0.80000000 | ⠀�[38;5;200m⢇�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;200m⡇�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀�[38;5;25m⢠�[0m�[38;5;100m⣳�[0m�[38;5;100m⠋�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⠐�[0m�[38;5;100m⡀�[0m⠀⠀⠀⠀⠀⠀⠀
0.73333333 | ⠀�[38;5;200m⢸�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;200m⢠�[0m�[38;5;200m⠃�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⣾�[0m�[38;5;100m⠃�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⠘�[0m�[38;5;100m⠂�[0m⠀⠀⠀⠀⠀⠀
0.66666667 | ⠀�[38;5;200m⠈�[0m�[38;5;200m⡆�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;200m⡸�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀�[38;5;100m⣰�[0m�[38;5;100m⠃�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⠄�[0m⠀⠀⠀⠀⠀
0.60000000 | ⠀⠀�[38;5;200m⢇�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;200m⡇�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀�[38;5;100m⢠�[0m�[38;5;100m⡏�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⠨�[0m�[38;5;100m⠄�[0m⠀⠀⠀⠀
0.53333333 | ⠀⠀�[38;5;200m⢸�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;200m⡸�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀�[38;5;100m⢠�[0m�[38;5;100m⢯�[0m�[38;5;25m⠃�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⠸�[0m⠀⠀⠀⠀
0.46666667 | ⠀⠀⠀�[38;5;200m⡇�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;200m⡇�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀�[38;5;100m⡞�[0m�[38;5;25m⡎�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.40000000 | ⠀⠀⠀�[38;5;200m⢸�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;200m⡸�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀�[38;5;100m⡼�[0m�[38;5;25m⢠�[0m�[38;5;25m⠃�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.33333333 | ⠀⠀⠀⠀�[38;5;200m⡇�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;200m⡇�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀�[38;5;100m⢰�[0m�[38;5;100m⠃�[0m�[38;5;25m⡎�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⠄�[0m⠀
0.26666667 | ⠀⠀⠀⠀�[38;5;200m⠸�[0m�[38;5;200m⡀�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;200m⡸�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀�[38;5;100m⢀�[0m�[38;5;100m⡏�[0m�[38;5;25m⢠�[0m�[38;5;25m⠃�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⠁�[0m⠀
0.20000000 | ⠀⠀⠀⠀⠀�[38;5;200m⢇�[0m⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;200m⢠�[0m�[38;5;200m⠃�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀�[38;5;100m⡼�[0m⠀�[38;5;25m⡎�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⠂�[0m
0.13333333 | ⠀⠀⠀⠀⠀�[38;5;200m⠈�[0m�[38;5;200m⢆�[0m⠀⠀⠀⠀⠀⠀�[38;5;200m⢀�[0m�[38;5;200m⠏�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇�[38;5;100m⢰�[0m�[38;5;100m⠁�[0m�[38;5;25m⢠�[0m�[38;5;25m⠃�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
0.06666667 | ⠀⠀⠀⠀⠀⠀�[38;5;200m⠈�[0m�[38;5;200m⢆�[0m⠀⠀⠀⠀�[38;5;200m⢠�[0m�[38;5;200m⠊�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⣇�[0m�[38;5;100m⠇�[0m⠀�[38;5;25m⡎�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
         0 | ⣀⣀⣀⣀⣀⣀⣀⣀�[38;5;200m⣳�[0m�[38;5;200m⣄�[0m�[38;5;200m⣀�[0m�[38;5;200m⣰�[0m�[38;5;200m⣃�[0m⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀�[38;5;100m⣟�[0m⣀�[38;5;25m⣠�[0m�[38;5;25m⣃�[0m⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀
-0.0666667 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⢰�[0m�[38;5;100m⡇�[0m⠀�[38;5;25m⡎�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-0.1333333 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⢀�[0m�[38;5;100m⠇�[0m⡇�[38;5;25m⢠�[0m�[38;5;25m⠃�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-0.2000000 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⡜�[0m⠀⡇�[38;5;25m⡎�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-0.2666667 | ⠀�[38;5;100m⠁�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⢸�[0m�[38;5;100m⠁�[0m⠀�[38;5;25m⣧�[0m�[38;5;25m⠃�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-0.3333333 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⢠�[0m�[38;5;100m⠇�[0m⠀⠀�[38;5;25m⡏�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-0.4000000 | ⠀⠀�[38;5;100m⠠�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⡞�[0m⠀⠀�[38;5;25m⢠�[0m�[38;5;25m⡇�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-0.4666667 | ⠀⠀⠀�[38;5;100m⠂�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⡼�[0m⠀⠀⠀�[38;5;25m⡎�[0m⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-0.5333333 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⢰�[0m�[38;5;100m⠃�[0m⠀⠀�[38;5;25m⢠�[0m�[38;5;25m⠃�[0m⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-0.6000000 | ⠀⠀⠀⠀�[38;5;100m⠘�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⢀�[0m�[38;5;100m⠏�[0m⠀⠀⠀�[38;5;25m⡎�[0m⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-0.6666667 | ⠀⠀⠀⠀⠀�[38;5;100m⠠�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⢀�[0m�[38;5;100m⡎�[0m⠀⠀⠀�[38;5;25m⢠�[0m�[38;5;25m⠃�[0m⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-0.7333333 | ⠀⠀⠀⠀⠀⠀�[38;5;100m⠰�[0m�[38;5;100m⡀�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⢀�[0m�[38;5;100m⡞�[0m⠀⠀⠀⠀�[38;5;25m⡎�[0m⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-0.8000000 | ⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⠑�[0m�[38;5;100m⡀�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⢀�[0m�[38;5;100m⡞�[0m⠀⠀⠀⠀�[38;5;25m⢠�[0m�[38;5;25m⠃�[0m⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-0.8666667 | ⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⠱�[0m⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⢠�[0m�[38;5;100m⠞�[0m⠀⠀⠀⠀⠀�[38;5;25m⡎�[0m⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-0.9333333 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⠆�[0m�[38;5;100m⡀�[0m⠀⠀⠀⠀⠀⠀�[38;5;100m⡴�[0m�[38;5;100m⠋�[0m⠀⠀⠀⠀⠀�[38;5;25m⢠�[0m�[38;5;25m⠃�[0m⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
        -1 | ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀�[38;5;100m⠐�[0m�[38;5;100m⠦�[0m�[38;5;100m⣀�[0m�[38;5;100m⣀�[0m�[38;5;100m⣠�[0m�[38;5;100m⠴�[0m�[38;5;100m⠊�[0m⠀⠀⠀⠀⠀⠀⠀�[38;5;25m⡎�[0m⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
-----------|-|---------|---------|---------|---------|---------|---------|-> (X)
           | -3        -2        -1        0         1         2         3        

Legend:
-------
�[38;5;25m⠤⠤ First line�[0m
�[38;5;100m⠤⠤ sin�[0m
�[38;5;200m⠤⠤ square�[0m

@tammoippen
Copy link
Owner

tammoippen commented Apr 1, 2019

If you want to plot in jupyter notebook, better use matplotlib. The magic commands do provide for a much better experience there.

@FinFighter
Copy link
Author

I appreciate the reply and clarification. I now understand it is an issue with where the characters are being printed, not a problem with the library itself. My intended use case was to print the charts to a text file for more informative algorithm performance reports. After running the provided code in the bash console I get the expected output. I'll modify my program to use the console instead of Jupiter Notebook. Thank you!

image

@tammoippen
Copy link
Owner

Great that it works for you! Have fun. Best, Tammo

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants