├── jupyter ├── parsers │ ├── __init__.py │ └── test.py ├── .gitignore ├── Dockerfile └── plot-examples.ipynb ├── paper ├── .gitignore ├── .latexmkrc └── Makefile ├── requirements.txt ├── kuroko └── kuroko-cli.exe ├── .gitignore ├── gnuplot ├── example │ ├── newhistogram.txt │ ├── data.csv │ ├── cdf.gp │ ├── histogram.csv │ ├── histogram.gp │ ├── boxplot.txt │ ├── plot.gp │ └── cdf.csv ├── README.md └── template.gp ├── drm-lib-pku.sh ├── .github └── workflows │ └── jupyter.yaml ├── gnuplot_watchdog.py ├── README.md ├── google_scholar.py └── matplotlib-template.py /jupyter/parsers/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /paper/.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | -------------------------------------------------------------------------------- /jupyter/parsers/test.py: -------------------------------------------------------------------------------- 1 | test_message = "Hello" -------------------------------------------------------------------------------- /jupyter/.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints 2 | __pycache__ 3 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | scholarly 2 | fuzzy_match 3 | bibtexparser 4 | regex 5 | watchdog -------------------------------------------------------------------------------- /kuroko/kuroko-cli.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wongsingfo/paper-util/HEAD/kuroko/kuroko-cli.exe -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | template/ 3 | 4 | gnuplot/**/*.pdf 5 | gnuplot/**/*.eps 6 | 7 | scholar.log 8 | 9 | kuroko/**/*.pdf 10 | -------------------------------------------------------------------------------- /gnuplot/example/newhistogram.txt: -------------------------------------------------------------------------------- 1 | A 16 0 0 18 1 0 18 0 3 14 1 8 10 5 10 2 | B 16 0 0 17 2 0 15 6 0 9 14 0 0 25 0 3 | C 16 0 0 18 1 0 19 2 0 12 11 0 2 23 0 4 | 5 | -------------------------------------------------------------------------------- /gnuplot/README.md: -------------------------------------------------------------------------------- 1 | # Gnuplot scripts 2 | 3 | Gnuplot 5.0+ is required to run these scripts. 4 | 5 | Run the command below to generate all figures. 6 | 7 | ``` 8 | cd example && gnuplot plot.gp 9 | ``` 10 | 11 | -------------------------------------------------------------------------------- /gnuplot/example/data.csv: -------------------------------------------------------------------------------- 1 | X,Y1,Y2,Y3 2 | 1,8,9,10.5 3 | 2,4.5,4.5,9.2 4 | 3,3.6,4,9 5 | 4,3.5,3.95,9.1 6 | 5,3.4,3.93,9 7 | 6,3.35,3.92,9 8 | 7,3.5,3.91,9.05 9 | 8,3.4,3.9,9 10 | 9,3.3,3.9,8.95 11 | 10,3.3,3.9,9 12 | -------------------------------------------------------------------------------- /paper/.latexmkrc: -------------------------------------------------------------------------------- 1 | # See latexmk (1) for details 2 | 3 | # tex -> pdf 4 | $pdf_mode=1; 5 | 6 | # %O: options 7 | # %S: source file 8 | $pdflatex = 'pdflatex -synctex=1 -interaction=nonstopmode %O %S'; 9 | $out_dir = 'build'; 10 | @generated_exts = (@generated_exts, 'synctex.gz'); 11 | 12 | $pdf_previewer = 'mupdf'; 13 | # run a command to do the update. 14 | $pdf_update_method = 4; 15 | $pdf_update_command = 'pkill -HUP mupdf'; 16 | -------------------------------------------------------------------------------- /paper/Makefile: -------------------------------------------------------------------------------- 1 | # usenix sigconf ieeeconf 2 | ENTRY=usenix 3 | 4 | all: 5 | latexmk -pdf -synctex=1 $(ENTRY).tex 6 | # refresh 7 | pkill -HUP mupdf 8 | 9 | preview: 10 | # Use -pvc option to let Latexmk to continuously check all input files 11 | # for changes and re-compile the whole thing 12 | latexmk -pdf -synctex=1 $(ENTRY).tex -pvc 13 | 14 | clean: 15 | latexmk -c 16 | # rm *.log *.fdb_latexmk *.aux *.bbl *.blg *.fls *.out *.xcp 17 | -------------------------------------------------------------------------------- /gnuplot/example/cdf.gp: -------------------------------------------------------------------------------- 1 | call '../template.gp' 'cdf' 2 | 3 | # datafile in CSV 4 | set datafile separator comma 5 | set datafile columnheaders 6 | 7 | set yrange [0:100] 8 | set key left top 9 | set ylabel 'CDF (%)' 10 | set xlabel 'Value' 11 | 12 | filename = 'cdf.csv' 13 | stats filename name 'STATS' nooutput 14 | N = STATS_columns 15 | array line_counts[N] 16 | 17 | do for [i=1:N] { 18 | stats filename using i name 'STATS' nooutput 19 | line_counts[i] = STATS_records + STATS_outofrange 20 | } 21 | 22 | plot for [i=1:N] filename using i:(100.0/line_counts[i]) \ 23 | smooth cumulative title columnhead(i) with lp pn 5 24 | -------------------------------------------------------------------------------- /gnuplot/example/histogram.csv: -------------------------------------------------------------------------------- 1 | strength,ours,ours_var,udp,udp_var,udp2,udp2_var,tack,tack_var,cubic,cubic_var,bbr,bbr_var,quic,quic_var 2 | -20,690.4,18.05670081837888,690.1,26.880186837975,576.0812484,64.08220661726659,499.0,13.727506854649334,135.2,1.398411797560202,558.9,28.285862192975,143.305492,18.458379 3 | -40,433.2,80.24102580489746,431.6,64.1460139923839,353.00391030000003,34.36056855104954,304.2,38.89815762560827,104.2,10.972693379476162,373.2,9.6622978633449,131.374275,18.425789 4 | -60,377.5,79.69560144003488,410.3,60.30303106441297,294.3363619,101.37727013778434,296.5,52.096598310787584,105.0,13.498971154211057,373.3,21.619666972453,73.244098,28.817169 5 | -------------------------------------------------------------------------------- /jupyter/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3 2 | 3 | # Install nodejs because some plugins require it. 4 | # 5 | # Install the last version of JupyterLab v3. The v4 changes the APIs and so 6 | # many plugins are not compatible yet. 7 | RUN curl -sL https://deb.nodesource.com/setup_18.x | bash - && apt -y install nodejs && \ 8 | pip install jupyterlab==3.6.5 && \ 9 | pip install matplotlib pandas numpy && \ 10 | pip install jupyterlab-vim ipympl && \ 11 | mkdir /app 12 | 13 | # Install the Arial font, which is favored by our research group. 14 | RUN echo "deb http://ftp.de.debian.org/debian sid main contrib" > /etc/apt/sources.list && \ 15 | apt update -y && \ 16 | apt install -y ttf-mscorefonts-installer && \ 17 | fc-cache -f -v 18 | 19 | WORKDIR /app 20 | 21 | ENTRYPOINT ["jupyter-lab", "--no-browser", "--ip='*'", "--allow-root", "--NotebookApp.token=''"] 22 | 23 | -------------------------------------------------------------------------------- /drm-lib-pku.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -xe 3 | 4 | JSESSIONID="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 5 | FID="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 6 | FILENAME="xxxxxxxx.pdf" 7 | 8 | i=0 9 | while true 10 | do 11 | URL="https://drm.lib.pku.edu.cn/jumpServlet?page=${i}&fid=${FID}&userid=&filename=${FILENAME}&visitid=" 12 | response=$(curl -s "$URL" -H "Cookie: JSESSIONID=${JSESSIONID}") 13 | http_code=$? 14 | 15 | if [ $http_code -ne 0 ]; then 16 | echo "Curl command failed with exit code: $http_code. Stopping." 17 | break 18 | fi 19 | 20 | echo "$response" >> a.json 21 | 22 | if [ -z "$response" ]; then 23 | echo "Received empty response. Stopping." 24 | break 25 | fi 26 | 27 | i=$((i+1)) 28 | done 29 | 30 | jq -r '.list[] | "\(.id) \(.src)"' all.json | 31 | while IFS=' ' read -r id src; do 32 | echo "Processing ID: $id with SRC: $src" 33 | curl "${src}" -H "Cookie: JSESSIONID=${JSESSIONID}" -o "${id}.jpg" 34 | done 35 | 36 | -------------------------------------------------------------------------------- /.github/workflows/jupyter.yaml: -------------------------------------------------------------------------------- 1 | name: Build and Push Docker Image 2 | 3 | on: 4 | push: 5 | schedule: 6 | - cron: "0 0 1 * *" 7 | 8 | jobs: 9 | docker: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Set up QEMU 13 | uses: docker/setup-qemu-action@v1 14 | - name: Set up Docker Buildx 15 | uses: docker/setup-buildx-action@v1 16 | - name: Login to DockerHub 17 | uses: docker/login-action@v1 18 | with: 19 | username: ${{ secrets.DOCKERHUB_USERNAME }} 20 | password: ${{ secrets.DOCKERHUB_TOKEN }} 21 | - name: Checkout repository 22 | uses: actions/checkout@v2 23 | - name: Build and push 24 | uses: docker/build-push-action@v2 25 | with: 26 | context: ./jupyter 27 | push: true 28 | tags: | 29 | wongsingfo/jupyter:latest 30 | wongsingfo/jupyter:amd64 31 | wongsingfo/jupyter:arm64 32 | platforms: linux/amd64,linux/arm64 33 | -------------------------------------------------------------------------------- /gnuplot/example/histogram.gp: -------------------------------------------------------------------------------- 1 | call '../template.gp' 'histogram' 2 | 3 | # datafile in CSV 4 | set datafile separator comma 5 | set datafile columnheaders 6 | 7 | set yr [0:800] 8 | set xr [-0.6:2.6] 9 | 10 | set key samplen 3 maxrows 4 11 | set key right top 12 | 13 | set grid y 14 | set xtics nomirror 15 | set ytics 200 16 | 17 | set style data histogram 18 | set style histogram cluster gap 2 19 | set style histogram errorbars lw 1 20 | 21 | set xl 'Signal Strength (dBm)' offset 0,0.5,0 22 | set yl 'Throughput (Mbps)' 23 | 24 | set multiplot 25 | set style fill transparent solid 0.5 border -1 26 | plot 'histogram.csv' using (column("ours")):(column("ours_var")):xtic(1) title "Ours" ,\ 27 | '' using (column("udp")):(column("udp_var")) title "UDP",\ 28 | '' using (column("udp2")):(column("udp2_var")) title "UDP2",\ 29 | '' using (column("tack")):(column("tack_var")) title "TACK",\ 30 | '' using (column("bbr")):(column("bbr_var")) title "BBR",\ 31 | '' using (column("cubic")):(column("cubic_var")) title "CUBIC",\ 32 | '' using (column("quic")):(column("quic_var")) title "QUIC" 33 | 34 | set style fill transparent pattern 4 35 | replot 36 | unset multiplot 37 | -------------------------------------------------------------------------------- /gnuplot_watchdog.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import time 3 | import os 4 | import subprocess 5 | from datetime import datetime 6 | from watchdog.observers import Observer 7 | from watchdog.events import FileSystemEventHandler 8 | 9 | logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s") 10 | 11 | def run_command(rc, cwd): 12 | try: 13 | output_bytes = subprocess.check_output(rc, shell=True, stderr=subprocess.STDOUT, cwd=cwd) 14 | except subprocess.CalledProcessError as e: 15 | output_bytes = e.output 16 | output_str = output_bytes.decode("utf-8") 17 | return output_str 18 | 19 | class MyHandler(FileSystemEventHandler): 20 | def __init__(self, ext_watched): 21 | self.ext_watched = ext_watched 22 | self.last_modified = datetime.now() 23 | 24 | def is_time_to_run(self): 25 | now = datetime.now() 26 | if (now - self.last_modified).total_seconds() > 0.2: 27 | self.last_modified = now 28 | return True 29 | return False 30 | 31 | def on_modified(self, event): 32 | if event.is_directory: 33 | return 34 | path = os.path.normpath(event.src_path).split(os.sep) 35 | if len(path) < 1: 36 | return 37 | filebase, fileext = os.path.splitext(path[-1]) 38 | logging.info("File modified: %s, ext = %s", path, fileext) 39 | if fileext not in self.ext_watched: 40 | return 41 | if not self.is_time_to_run(): 42 | logging.info("Too soon to run") 43 | return 44 | work_dir = os.path.join(*path[:-1]) 45 | logging.info("Running gnuplot in %s", work_dir) 46 | rc = f"gnuplot plot.gp" 47 | print(run_command(rc, work_dir)) 48 | 49 | 50 | def main(figure_path, ext_watched): 51 | observer = Observer() 52 | observer.schedule(MyHandler(ext_watched), path=figure_path, recursive=True) 53 | observer.start() 54 | try: 55 | while True: 56 | time.sleep(3600) 57 | except KeyboardInterrupt: 58 | observer.stop() 59 | observer.join() 60 | 61 | if __name__ == "__main__": 62 | main('./gnuplot', ['.gp', '.csv', '.txt']) 63 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # paper-util 2 | 3 | This repo includes utilities for paper writing. 4 | 5 | ## google_scholar.py 6 | 7 | This tool searches for literature by title on Google Scholar. It can also automatically add the corresponding BibTeX entry to a specified `.bib` file. It works as follows: 8 | 9 | 1. Check if the literature already exists in the `.bib` file. It performs a fuzzy and partial lookup on the title. For example, both "Snap" and "microkernel approach" will match the literature "Snap: a Microkernel Approach to Host Network". 10 | 2. Perform a lookup on Google Scholar. 11 | 3. Add the BibTeX entry to the `.bib` file. 12 | 13 | The program will prompt the user to ask if a specific action should be taken. 14 | 15 | ``` 16 | usage: google_scholar.py [-h] [-f bibtex] pubs 17 | 18 | Get bibtex from Google Scholar 19 | 20 | positional arguments: 21 | pubs publication title 22 | 23 | optional arguments: 24 | -h, --help show this help message and exit 25 | -f bibtex look up this bibtex before searching Google Scholar 26 | 27 | Examples: 28 | ./google_scholar.py 'ZygOS: Achieving Low Tail Latency for Microsecond-scale Networked Tasks' 29 | ./google_scholar.py 'Snap: a Microkernel Approach to Host Network' -f ref.bib 30 | ``` 31 | 32 | ## gnuplot 33 | 34 | Gnuplot scirpts. 35 | 36 | ## gnuplot_watchdog.py 37 | 38 | This script replots the figures when you save your plot scripts or data file. 39 | 40 | ## Kuroko 41 | 42 | [Kuroko-CLI](https://github.com/shioyadan/kuroko-cli) developed by [shioyadan](https://github.com/shioyadan) is an amazing command line tool to convert from EMF to PDF. Now you can create PDF files from PowerPoint/Excel for use in LaTeX. This tool also has [the GUI counterpart](https://github.com/shioyadan/kuroko). 43 | 44 | This tool is extremely useful for Windows users. On macOS, you can use the Preview application to do the same thing. 45 | 46 | ``` 47 | $ ./kuroko-cli.exe 48 | Kuroko version 0.03 49 | Usage: 50 | kuroko -b PDF_FILE_NAME 51 | Capture EMF data in a clipboard and convert it to a PDF file. 52 | kuroko -c EMF_FILE_NAME [PDF_FILE_NAME] 53 | Convert an EMF file to a PDF file. 54 | kuroko -i 55 | Install a dedicated printer for Kuroko. You should install it before use. 56 | kuroko -k 57 | Check whether a dedicated printer is installed. 58 | ``` 59 | 60 | ## Latex Table 61 | 62 | https://tableconvert.com/latex-generator 63 | 64 | -------------------------------------------------------------------------------- /gnuplot/example/boxplot.txt: -------------------------------------------------------------------------------- 1 | #Latitude Longitude Continent Source Color_index Angle_start_at Angle Value Continent_total 2 | 55.0 85.0 "ASIA (EXCL. MIDDLE EAST)" Coal 0 215.410 144.590 947639 2362223 3 | 55.0 85.0 "ASIA (EXCL. MIDDLE EAST)" Oil 1 154.375 61.034 400017 2362223 4 | 55.0 85.0 "ASIA (EXCL. MIDDLE EAST)" Gas 2 112.828 41.544 272284 2362223 5 | 55.0 85.0 "ASIA (EXCL. MIDDLE EAST)" Nuclear 3 94.921 17.906 117365 2362223 6 | 55.0 85.0 "ASIA (EXCL. MIDDLE EAST)" Hydroelectric 4 88.182 6.739 44165 2362223 7 | 55.0 85.0 "ASIA (EXCL. MIDDLE EAST)" Renewable 5 0.000 88.182 577942 2362223 8 | 17.0 -90.0 "C. AMERICA & CARIBBEAN" Coal 0 353.272 6.728 4868 260434 9 | 17.0 -90.0 "C. AMERICA & CARIBBEAN" Oil 1 105.476 247.795 179261 260434 10 | 17.0 -90.0 "C. AMERICA & CARIBBEAN" Gas 2 49.774 55.703 40297 260434 11 | 17.0 -90.0 "C. AMERICA & CARIBBEAN" Nuclear 3 46.170 3.604 2607 260434 12 | 17.0 -90.0 "C. AMERICA & CARIBBEAN" Hydroelectric 4 40.363 5.803 4199 260434 13 | 17.0 -90.0 "C. AMERICA & CARIBBEAN" Renewable 5 0.000 40.363 29201 260434 14 | 25.0 38.0 "MIDDLE EAST & N. AFRICA" Coal 0 356.659 3.341 14229 1532806 15 | 25.0 38.0 "MIDDLE EAST & N. AFRICA" Oil 1 65.383 291.272 1240170 1532806 16 | 25.0 38.0 "MIDDLE EAST & N. AFRICA" Gas 2 4.176 61.211 260613 1532806 17 | 25.0 38.0 "MIDDLE EAST & N. AFRICA" Nuclear 3 4.176 0.000 0 1532806 18 | 25.0 38.0 "MIDDLE EAST & N. AFRICA" Hydroelectric 4 2.848 1.328 5653 1532806 19 | 25.0 38.0 "MIDDLE EAST & N. AFRICA" Renewable 5 0.000 2.848 12124 1532806 20 | 50.0 -95.0 "NORTH AMERICA" Coal 0 254.200 105.800 600275 2053057 21 | 50.0 -95.0 "NORTH AMERICA" Oil 1 167.857 86.342 489867 2053057 22 | 50.0 -95.0 "NORTH AMERICA" Gas 2 64.714 103.144 585206 2053057 23 | 50.0 -95.0 "NORTH AMERICA" Nuclear 3 25.888 38.826 220291 2053057 24 | 50.0 -95.0 "NORTH AMERICA" Hydroelectric 4 16.207 9.680 54923 2053057 25 | 50.0 -95.0 "NORTH AMERICA" Renewable 5 0.000 16.207 91945 2053057 26 | -10.0 -55.0 "SOUTH AMERICA" Coal 0 341.204 18.796 29025 555962 27 | -10.0 -55.0 "SOUTH AMERICA" Oil 1 117.616 223.589 345297 555962 28 | -10.0 -55.0 "SOUTH AMERICA" Gas 2 70.412 47.203 72900 555962 29 | -10.0 -55.0 "SOUTH AMERICA" Nuclear 3 68.540 1.868 2888 555962 30 | -10.0 -55.0 "SOUTH AMERICA" Hydroelectric 4 40.504 28.037 43298 555962 31 | -10.0 -55.0 "SOUTH AMERICA" Renewable 5 0.000 40.504 62553 555962 32 | -5.0 25.0 "SUB-SAHARAN AFRICA" Coal 0 271.883 88.117 129456 528895 33 | -5.0 25.0 "SUB-SAHARAN AFRICA" Oil 1 144.518 127.364 187118 528895 34 | -5.0 25.0 "SUB-SAHARAN AFRICA" Gas 2 138.254 6.264 9203 528895 35 | -5.0 25.0 "SUB-SAHARAN AFRICA" Nuclear 3 135.979 2.275 3345 528895 36 | -5.0 25.0 "SUB-SAHARAN AFRICA" Hydroelectric 4 133.049 2.927 4302 528895 37 | -5.0 25.0 "SUB-SAHARAN AFRICA" Renewable 5 0.000 133.049 195472 528895 38 | 50.0 25.0 EUROPE Coal 0 296.352 63.648 391517 2228407 39 | 50.0 25.0 EUROPE Oil 1 190.894 105.458 648678 2228407 40 | 50.0 25.0 EUROPE Gas 2 70.358 120.532 741413 2228407 41 | 50.0 25.0 EUROPE Nuclear 3 21.013 49.349 303542 2228407 42 | 50.0 25.0 EUROPE Hydroelectric 4 11.009 10.001 61526 2228407 43 | 50.0 25.0 EUROPE Renewable 5 0.000 11.009 67725 2228407 44 | -24.0 133.0 OCEANIA Coal 0 99.130 260.870 155000 227112 45 | -24.0 133.0 OCEANIA Oil 1 56.214 42.916 25500 227112 46 | -24.0 133.0 OCEANIA Gas 2 10.771 45.443 27000 227112 47 | -24.0 133.0 OCEANIA Nuclear 3 10.771 0.000 0 227112 48 | -24.0 133.0 OCEANIA Hydroelectric 4 8.417 2.358 1400 227112 49 | -24.0 133.0 OCEANIA Renewable 5 0.000 8.417 5000 227112 50 | 51 | -------------------------------------------------------------------------------- /gnuplot/template.gp: -------------------------------------------------------------------------------- 1 | # Author: Chengke Wang (chengke@pku.edu.cn) 2 | 3 | # Call the script with the following line: 4 | # call template.gp 5 | # This script accepts three arguments: 6 | # ARG1: The output file name 7 | # ARG2: Size scale in X dimension 8 | # ARG3: Size scale in Y dimension 9 | # By default, the output is 3.33 inch x 2.22 inch (column width is 3.33 inch in most conference) 10 | 11 | arg1=ARG1 12 | arg2=ARG2 13 | arg3=ARG3 14 | 15 | # Shell script for compiling Gnuplot on save: 16 | # inotifywait -qme close_write $(find . -name '*.gp' ) | while read -r file event; do ( cd $(dirname $file) && gnuplot $(basename $file) ); done 17 | 18 | # Gnuplot resources: 19 | # - http://www.gnuplotting.org/ 20 | # - http://www.bersch.net/gnuplot-doc/gnuplot.html 21 | 22 | set macros 23 | # Print to stdout. 24 | set print '-' 25 | 26 | # Utility functions and macros: 27 | 28 | is_empty_string(str) = '' eq str 29 | 30 | # Submissions must be in two-column format, using 10-point type on 12-point 31 | # (single-spaced) leading, in a text block 7'' wide x 9'' deep, with .33'' 32 | # inter-column space, formatted for 8.5'' x 11'' paper. 33 | # 34 | # 1 in = 96 px 35 | 36 | plot_width=3.33 37 | plot_height=plot_width / 3 * 2 38 | 39 | # Gnuplot use a defalut font scale of 0.5 40 | default_font = "Arial,12" 41 | 42 | if (!is_empty_string(arg1)) { 43 | outputfile=arg1 44 | } 45 | if (!is_empty_string(arg2)) { 46 | plot_width = plot_width * arg2 47 | plot_height = plot_height * (is_empty_string(arg3) ? arg2 : arg3) 48 | } 49 | 50 | # ------------------------------------------------------------------------------ 51 | # set terminal postscript eps color default_font size plot_width,plot_height 52 | # set output sprintf("%s.eps", outputfile) 53 | 54 | set terminal pdfcairo enhanced color font default_font size plot_width,plot_height 55 | set output sprintf("%s.pdf", outputfile) 56 | 57 | # ------------------------------------------------------------------------------ 58 | # Color scheme that is friendly to colorblind people 59 | # Tol, Paul. 2021. “Colour Schemes.” Technical note SRON/EPS/TN/09-002 3.2. SRON 60 | # link: https://personal.sron.nl/~pault/data/colourschemes.pdf 61 | 62 | # Diverging Colour Schemes 63 | set palette defined (\ 64 | 0 '#364B9A',\ 65 | 1 '#4A7BB7',\ 66 | 2 '#6EA6CD',\ 67 | 3 '#98CAE1',\ 68 | 4 '#C2E4EF',\ 69 | 5 '#EAECCC',\ 70 | 6 '#FEDA8B',\ 71 | 7 '#FDB366',\ 72 | 8 '#F67E4B',\ 73 | 9 '#DD3D2D',\ 74 | 10 '#A50026') 75 | 76 | # Qualitative Colour Schemes 77 | set linetype 1 lc rgb '#4477AA' pt 4 # blue 78 | set linetype 2 lc rgb '#EE6677' pt 6 # red 79 | set linetype 3 lc rgb '#228833' pt 8 # green 80 | set linetype 4 lc rgb '#CCBB44' pt 10 # yellow 81 | set linetype 5 lc rgb '#66CCEE' pt 12 # cyan 82 | set linetype 6 lc rgb '#AA3377' pt 14 # purple 83 | set linetype 7 lc rgb '#BBBBBB' pt 3 # grey 84 | 85 | # ------------------------------------------------------------------------------ 86 | # Default settings 87 | set grid y 88 | # set style fill transparent pattern 4 89 | set style fill transparent solid 1.0 border -1 90 | 91 | # ------------------------------------------------------------------------------ 92 | # Common Questions 93 | # 94 | # Q: What is difference between linestyle and linetype? 95 | # A: A linestyle is a temporary association of properties, while linetypes are 96 | # permanent (that is, they are not affected by the reset command). 97 | # 98 | # Q: How to fill the histogram with both solid color and pattern? 99 | # A: Ops, Gnuplot does not support this. A workaournd is to use multiplot to 100 | # draw the pattern. 101 | # 102 | -------------------------------------------------------------------------------- /google_scholar.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import argparse 4 | import sys 5 | 6 | try: 7 | from scholarly import scholarly 8 | from fuzzy_match import algorithims 9 | import bibtexparser 10 | import regex 11 | except ImportError as e: 12 | print("""Install dependencies first using the following command and try again: 13 | 14 | pip install scholarly fuzzy_match bibtexparser regex 15 | """) 16 | raise e 17 | 18 | 19 | class NotFoundError(Exception): 20 | def __init__(self, message): 21 | self.message = message 22 | 23 | 24 | def query_yes_no(question, default="yes"): 25 | """Ask a yes/no question via raw_input() and return their answer. 26 | 27 | "question" is a string that is presented to the user. 28 | "default" is the presumed answer if the user just hits . 29 | It must be "yes" (the default), "no" or None (meaning 30 | an answer is required of the user). 31 | 32 | The "answer" return value is True for "yes" or False for "no". 33 | """ 34 | valid = {"yes": True, "y": True, "ye": True, 35 | "no": False, "n": False} 36 | if default is None: 37 | prompt = " [y/n] " 38 | elif default == "yes": 39 | prompt = " [Y/n] " 40 | elif default == "no": 41 | prompt = " [y/N] " 42 | else: 43 | raise ValueError("invalid default answer: '%s'" % default) 44 | 45 | while True: 46 | sys.stdout.write(question + prompt) 47 | choice = input().lower() 48 | if default is not None and choice == '': 49 | return valid[default] 50 | elif choice in valid: 51 | return valid[choice] 52 | else: 53 | sys.stdout.write("Please respond with 'yes' or 'no' " 54 | "(or 'y' or 'n').\n") 55 | 56 | 57 | def query_bib_title(bibtex: dict) -> bool: 58 | return query_yes_no(bibtex["title"]) 59 | 60 | 61 | def get_bibtex_for_pubs(pubs: str) -> str: 62 | """Returns bibtex""" 63 | search_query = scholarly.search_pubs(pubs) 64 | for result in search_query: 65 | if query_bib_title(result["bib"]): 66 | return scholarly.bibtex(result) 67 | 68 | raise NotFoundError(f"Can't find {pubs}") 69 | 70 | def search_pubs_in_bib(bib: str, pubs:str) -> str: 71 | """Returns matched bibtex ID""" 72 | with open(bib) as bibtex_file: 73 | bib_database = bibtexparser.load(bibtex_file) 74 | 75 | def match_algo(title, key) -> float: 76 | if regex.search('(%s){e<=1}' % key, title, flags=regex.IGNORECASE): 77 | return 0.8 78 | return algorithims.trigram(title, key) 79 | 80 | 81 | match_threshold = 0.7 82 | results : List[Tuple[float, dict]] = [] 83 | 84 | for entry in bib_database.entries: 85 | if 'title' in entry: 86 | score = match_algo(entry['title'], pubs) 87 | match_result = (score, entry) 88 | results.append(match_result) 89 | 90 | results.sort(key=lambda x: x[0], reverse=True) 91 | for result in results: 92 | if result[0] >= match_threshold and query_bib_title(result[1]): 93 | return result[1]['ID'] 94 | 95 | raise NotFoundError(f"no match for '{pubs} in {bib}") 96 | 97 | 98 | def prepend_to_bib(new_entry: str, bibfile: str): 99 | with open(bibfile) as bibtex_file: 100 | bib_database = bibtexparser.load(bibtex_file) 101 | 102 | new_database = bibtexparser.loads(new_entry) 103 | bib_database.entries.insert(0, new_database.entries[0]) 104 | 105 | with open(bibfile, 'w') as bibtex_file: 106 | bibtexparser.dump(bib_database, bibtex_file) 107 | 108 | 109 | if __name__ == "__main__": 110 | example_text = """Examples: 111 | ./google_scholar.py 'ZygOS: Achieving Low Tail Latency for Microsecond-scale Networked Tasks' 112 | ./google_scholar.py 'Snap: a Microkernel Approach to Host Network' -f ref.bib 113 | """ 114 | parser = argparse.ArgumentParser(description="Get bibtex for publication", 115 | epilog=example_text, 116 | formatter_class=argparse.RawDescriptionHelpFormatter) 117 | parser.add_argument('pubs', help="publication title") 118 | parser.add_argument('-f', metavar='bibtex', help="look up this bibtex before searching Google Scholar") 119 | args = parser.parse_args() 120 | 121 | if args.f is not None: 122 | try: 123 | print(f"Searching the {args.f} file") 124 | bibtex_id = search_pubs_in_bib(args.f, args.pubs) 125 | print(bibtex_id) 126 | exit(0) 127 | except NotFoundError: 128 | print(f"Cannot find '{args.pubs}' in {args.f}") 129 | 130 | print("Searching on Google Scholar") 131 | bibtex = get_bibtex_for_pubs(args.pubs) 132 | 133 | print() 134 | print(bibtex) 135 | 136 | if args.f and query_yes_no(f"Add this entry to {args.f}?"): 137 | prepend_to_bib(bibtex, args.f) 138 | 139 | 140 | 141 | 142 | 143 | -------------------------------------------------------------------------------- /gnuplot/example/plot.gp: -------------------------------------------------------------------------------- 1 | reset session 2 | call '../template.gp' '01-layout' 1.0 1.5 3 | 4 | set multiplot layout 3,1 # 3 rows, 1 column 5 | 6 | # datafile in CSV 7 | set datafile separator ',' 8 | set datafile columnheaders 9 | 10 | set ytics 1 11 | # Offsets provide a mechanism to expand these ranges to leave empty space 12 | # between the data and the plot borders. 13 | set offsets 1,0,0,0 # , , , 14 | plot 'data.csv' using 1:2 title columnhead(2) with lp 15 | unset offsets 16 | 17 | set ytics 1 18 | set ylabel '{/Symbol \260}C' offset -1,0 19 | 20 | # The size and origin are in screen coordinates. 21 | set size 1, 0.2 22 | set origin 0, 0.333 # 0,0 is the lower left corner 23 | 24 | plot sin(x) 25 | 26 | # The size and origin conflicts with the margin settings 27 | unset size 28 | unset origin 29 | # The margin is the distance between the plot border and the outer edge of the 30 | # canvas. The units of are character heights or widths: 31 | set lmargin 4 32 | set rmargin 0 33 | # Or a fraction of the full drawing area (This placement ignores the current 34 | # values of set origin and set size, and is intended as an alternative method 35 | # for positioning graphs within a multiplot.): 36 | set tmargin at screen 0.33 37 | set bmargin at screen 0.1 38 | plot sin(x) 39 | 40 | unset multiplot 41 | reset session 42 | call '../template.gp' '02-label' 43 | 44 | set xrange[-pi:2*pi] 45 | 46 | set object 1 rectangle from graph 0,0 to first 0.8, graph 1 47 | set object 1 fillstyle transparent solid 0.5 noborder fc ls 1 48 | set arrow from -0.5,sin(-0.5) to pi+0.5,sin(pi+0.5) filled lc 5 49 | set arrow from -0.4,sin(-0.4) to pi+0.4,sin(pi+0.4) nohead lw 5 dt 3 lc 2 50 | set arrow from -0.6,sin(-0.6) to pi+0.6,sin(pi+0.6) heads lw 3 lc 3 51 | set label "(0,0)" at 0,0 center 52 | set label "{/Symbol D}+0.5^2" at 0.1,0.5 center rotate by 65 textcolor lt 2 53 | set label "at graph 0.8" at graph 0.8,0.2 tc ls 6 54 | set arrow from -2, graph 0 to -2, graph 1 filled 55 | 56 | plot sin(x) 57 | 58 | reset session 59 | call '../template.gp' '03-boxplot' 60 | 61 | set style data boxplot 62 | #set xtics ('N1' 1, 'N2' 2) 63 | set ylabel 'Data' 64 | set xtics rotate by 25 right 65 | 66 | # supress the outliers 67 | # set style boxplot nooutliers 68 | 69 | set linetype 51 lc 1 70 | set linetype 52 lc 1 71 | set linetype 53 lc 1 72 | set linetype 54 lc 2 73 | set linetype 55 lc 3 74 | set linetype 56 lc 3 75 | set linetype 57 lc 3 76 | plot 'boxplot.txt' using (1):($8/1e6):(0):4 ps 0.5 lt 51 lc variable not 77 | 78 | reset session 79 | call '../template.gp' '04-cdf' 80 | 81 | # datafile in CSV 82 | set datafile separator ',' 83 | set datafile columnheaders 84 | 85 | set yrange [0:100] 86 | set key left top 87 | set ylabel 'CDF (%)' 88 | set xlabel 'value' 89 | num_line = 1000 90 | 91 | filename = 'cdf.csv' 92 | N = 2 93 | array line_counts[N] 94 | 95 | do for [i=1:N] { 96 | stats filename using i name "STATS" nooutput 97 | # The result is affected by yrange 98 | line_counts[i] = STATS_records + STATS_outofrange 99 | } 100 | 101 | plot for [i=1:N] filename using i:(100.0/line_counts[i]) \ 102 | smooth cumulative title columnhead(i) with lp pn 5 103 | 104 | reset session 105 | call '../template.gp' '05-newhistogram' 106 | set datafile nocolumnheaders 107 | 108 | # set key samplen 2 109 | set key maxrows 1 110 | # set key vertical # limited by maxrows 111 | # set key horizontal # limited by maxcols 112 | set key left top 113 | set style data histograms 114 | set style histogram rowstacked title offset 0,0.2 115 | set bmargin 5 116 | set xlabel "Utilization" offset 0,-0.4 117 | set ylabel "Number of pieces used" 118 | set yrange [0:30] 119 | 120 | # ref: http://www.bersch.net/gnuplot-doc/histograms.html#newhistogram 121 | # newhistogram {"" {font "name,size"} {tc <colorspec>}} 122 | # {lt <linetype>} {fs <fillstyle>} {at <x-coord>} 123 | 124 | fill_option='fillstyle pattern 4+i lc i+1' 125 | 126 | plot newhistogram "1.3", 'newhistogram.txt' u 2:xtic(1) t "used" fs pattern 4,\ 127 | '' u 3 t "usable",\ 128 | '' u 4 t "wasted",\ 129 | newhistogram "1.5", for [i=0:2] '' u (column(8+i)):xtic(1) @fill_option notitle,\ 130 | newhistogram "1.7", for [i=0:2] '' u (column(8+i)):xtic(1) @fill_option notitle,\ 131 | newhistogram "1.8", for [i=0:2] '' u (column(11+i)):xtic(1) @fill_option notitle,\ 132 | newhistogram '2.0', for [i=0:2] '' u (column(14+i)):xtic(1) @fill_option notitle,\ 133 | 134 | 135 | reset session 136 | call '../template.gp' '06-lines' 137 | 138 | # Bessel functions (after Bronstein 2001, eq. 9.54a) 139 | besj2(x) = 2*1/x * besj1(x) - besj0(x) 140 | besj3(x) = 2*2/x * besj2(x) - besj1(x) 141 | besj4(x) = 2*3/x * besj3(x) - besj2(x) 142 | besj5(x) = 2*4/x * besj4(x) - besj3(x) 143 | besj6(x) = 2*5/x * besj5(x) - besj4(x) 144 | besj0_(x) = x<5 ? besj0(x) : 1/0 145 | 146 | set label 'J_0' at 1.4,0.90 center tc lt 1 147 | set label 'J_1' at 1.9,0.67 center tc lt 2 148 | set label 'J_2' at 3.2,0.57 center tc lt 3 149 | set label 'J_3' at 4.3,0.51 center tc lt 4 150 | set label 'J_4' at 5.4,0.48 center tc lt 5 151 | set label 'J_5' at 6.5,0.45 center tc lt 6 152 | set label 'J_6' at 7.6,0.43 center tc lt 7 153 | 154 | set xrange [0:15] 155 | unset key 156 | 157 | line_options = 'w lp pn 6' 158 | plot besj0(x) @line_options, \ 159 | besj1(x) @line_options, \ 160 | besj2(x) @line_options, \ 161 | besj3(x) @line_options, \ 162 | besj4(x) @line_options, \ 163 | besj5(x) @line_options, \ 164 | besj6(x) @line_options 165 | -------------------------------------------------------------------------------- /matplotlib-template.py: -------------------------------------------------------------------------------- 1 | from cycler import cycler 2 | from matplotlib import patches, ticker 3 | import argparse 4 | import json 5 | import matplotlib.colors as mcolors 6 | import matplotlib.font_manager as font_manager 7 | import matplotlib.pyplot as plt 8 | import numpy as np 9 | import os 10 | import pandas as pd 11 | import pyoverleaf 12 | import re 13 | import sys 14 | 15 | 16 | ## Presets 17 | 18 | linestyle_str = [ 19 | ("solid", "solid"), # Same as (0, ()) or '-' 20 | ("dotted", "dotted"), # Same as (0, (1, 1)) or ':' 21 | ("dashed", "dashed"), # Same as '--' 22 | ("dashdot", "dashdot"), # Same as '-.' 23 | ] 24 | 25 | linestyle_tuple = [ 26 | ("loosely dotted", (0, (1, 10))), 27 | ("dotted", (0, (1, 1))), 28 | ("densely dotted", (0, (1, 1))), 29 | ("long dash with offset", (5, (10, 3))), 30 | ("loosely dashed", (0, (5, 10))), 31 | ("dashed", (0, (5, 5))), 32 | ("densely dashed", (0, (5, 1))), 33 | ("loosely dashdotted", (0, (3, 10, 1, 10))), 34 | ("dashdotted", (0, (3, 5, 1, 5))), 35 | ("densely dashdotted", (0, (3, 1, 1, 1))), 36 | ("dashdotdotted", (0, (3, 5, 1, 5, 1, 5))), 37 | ("loosely dashdotdotted", (0, (3, 10, 1, 10, 1, 10))), 38 | ("densely dashdotdotted", (0, (3, 1, 1, 1, 1, 1))), 39 | ] 40 | 41 | 42 | # Take a color in hexadecimal format and return a new color with a certain 43 | # level of transparency applied to it. 44 | def get_transparent_color(color, transparency=0.5): 45 | c = mcolors.hex2color(color) 46 | c = [*map(lambda x: x * transparency + (1.0 - transparency), mcolors.hex2color(c))] 47 | hex_color = "#{:02X}{:02X}{:02X}".format( 48 | int(c[0] * 255), int(c[1] * 255), int(c[2] * 255) 49 | ) 50 | return hex_color 51 | 52 | 53 | palette = ['#EE6677', '#4477AA', '#8ECFC9', '#FFBE7A', '#BEB8DC', '#E7DAD2'] # Genshin by Yuhan 54 | palette = ["#F27970", "#BB9727", "#54B345", "#32B897", "#05B9E2", "#8983BF"] # Rainblow 55 | palette = ["#3853a4", "#146533", "#ed1f24", "#708191", "#faa51a", "#b9519f"] # Contrast 56 | 57 | patterns = [ "|" , "-" , "+" , "x", "o", "O", ".", "*" ] 58 | patterns = ["", "/", "\\", "x", ".", "o"] 59 | patterns = ["", "/", "\\", ".", "o", "//", "\\\\", "|", "-", "+", "x", "*"] 60 | 61 | linestyles = ["-", "--", ":", "-.", (0, (3, 1, 1, 1, 1, 1)), (5, (10, 3))] 62 | 63 | # See: https://matplotlib.org/stable/gallery/lines_bars_and_markers/marker_reference.html 64 | markers = ["v", "*", ".", "s", "1", "x"] 65 | 66 | # `colors` for border lines and `colors_fill` for filled areas 67 | colors = plt.rcParams["axes.prop_cycle"].by_key()["color"] 68 | colors_fill = list(map(get_transparent_color, colors)) 69 | 70 | 71 | ## Global configuration 72 | 73 | # WARNING: sometimes the axes are not aligned when generating PDF. 74 | # plt.rcParams["figure.constrained_layout.use"] = True 75 | # plt.rcParams["savefig.bbox"] = "tight" 76 | 77 | # This is to make the font type of the PDF and PS files to be Type 42, 78 | # which is required by most of the conference papers. 79 | plt.rcParams['pdf.fonttype'] = 42 80 | plt.rcParams['ps.fonttype'] = 42 81 | 82 | # Use `plt.subplots_adjust(left=0.5)` to adjust. 83 | plt.rcParams["figure.subplot.left"] = 0.2 84 | plt.rcParams["figure.subplot.right"] = 0.9 85 | plt.rcParams["figure.subplot.bottom"] = 0.11 86 | plt.rcParams["figure.subplot.top"] = 0.88 87 | plt.rcParams["figure.subplot.wspace"] = 0.2 88 | plt.rcParams["figure.subplot.hspace"] = 0.2 89 | 90 | plt.rcParams["figure.figsize"] = [4.0, 3.0] 91 | plt.rcParams["figure.dpi"] = 80 92 | plt.rcParams["savefig.dpi"] = 300 93 | plt.rcParams["font.size"] = 18 94 | plt.rcParams["font.family"] = "Arial" 95 | plt.rcParams["legend.fontsize"] = "medium" 96 | plt.rcParams["legend.facecolor"] = "white" 97 | plt.rcParams["legend.edgecolor"] = "white" 98 | plt.rcParams["legend.framealpha"] = 0.9 99 | plt.rcParams["figure.titlesize"] = "medium" 100 | plt.rcParams["grid.linestyle"] = "--" 101 | plt.rcParams["xtick.direction"] = "in" 102 | plt.rcParams["ytick.direction"] = "in" 103 | plt.rcParams["axes.prop_cycle"] = cycler(color=palette) + cycler(linestyle=linestyles) 104 | 105 | ## Helper Functions 106 | 107 | 108 | def savefig(args, filename): 109 | plt.savefig(filename) 110 | upload(args, filename) 111 | 112 | 113 | def upload(args, filename): 114 | if not args.upload: 115 | # print("If you want to upload, please set --upload") 116 | return 117 | 118 | with open(filename, "rb") as fin: 119 | file_bytes = fin.read() 120 | 121 | outfile = os.path.basename(filename) 122 | print("Uploading", outfile, end=" ...") 123 | sys.stdout.flush() 124 | args.overleaf_api.project_upload_file( 125 | args.overleaf_project_id, args.overleaf_folder_id, outfile, file_bytes 126 | ) 127 | print(" Done") 128 | 129 | 130 | def plot_test_figure(args): 131 | x = np.arange(0, 4, 0.05) 132 | 133 | fig, ax = plt.subplots() 134 | fig.set_size_inches((4, 3)) 135 | 136 | ax.plot(x, np.sin(x * np.pi), label="sin") 137 | ax.plot(x, np.sin((x + 0.2) * np.pi), label="sin") 138 | ax.plot(x, np.sin((x + 0.4) * np.pi), label="sin") 139 | ax.plot(x, np.sin((x + 0.6) * np.pi), label="sin") 140 | ax.plot(x, np.sin((x + 0.8) * np.pi), label="sin") 141 | ax.plot(x, np.sin((x + 1.0) * np.pi), label="sin") 142 | 143 | ax.set_xlabel("$x$") 144 | ax.set_ylabel(r"$y = sin(x + \phi)$") 145 | ax.set_title("Sine wave") 146 | 147 | ax.grid(True) 148 | 149 | # https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.legend.html 150 | ax.legend( 151 | loc="upper center", 152 | frameon=False, 153 | bbox_to_anchor=(-0.1, 1.5, 1.2, 0.15), 154 | ncol=3, 155 | borderaxespad=0, 156 | handlelength=1.5, 157 | mode="expand", 158 | handletextpad=0.5, 159 | columnspacing=1, 160 | labelspacing=0.3, 161 | ) 162 | 163 | savefig(args, args.output) 164 | 165 | 166 | if __name__ == "__main__": 167 | parser = argparse.ArgumentParser() 168 | parser.add_argument("--input", type=str, help="Input file path") 169 | parser.add_argument("--output", type=str, default="test.pdf") 170 | parser.add_argument("--upload", help="Upload to Overleaf", action="store_true") 171 | parser.add_argument("--plot", type=str, default="test_figure") 172 | 173 | args = parser.parse_args() 174 | 175 | function_name = f"plot_{args.plot}" 176 | function = globals()[function_name] 177 | function(args) 178 | -------------------------------------------------------------------------------- /gnuplot/example/cdf.csv: -------------------------------------------------------------------------------- 1 | A,B 2 | 0.63,-0.28 3 | 1.24,-1.53 4 | 0.33,0.07 5 | 1.01,-1.21 6 | 0.55,-1.24 7 | 1.17,-1.31 8 | 0.73,-1.54 9 | 0.36,-1.21 10 | 1.75,1.33 11 | 1.61,1.89 12 | 0.66,-0.4 13 | 0.82,0.42 14 | 1.42,-0.25 15 | 2.4,1.1 16 | 0.75,1.63 17 | 0.94,-0.16 18 | 0.49,0.04 19 | 1.2,0.09 20 | 0.9,-0.04 21 | 0.07,-1.13 22 | 0.62,1.14 23 | 0.51,-1.76 24 | 1.22,1.25 25 | 0.7,-0.62 26 | 1.8,-1.58 27 | 1.44,-0.32 28 | 1.38,1 29 | 0.92,-0.22 30 | 0.84,-0.47 31 | 1.23,-0.75 32 | 1.67,-0.8 33 | 1.7,-0.1 34 | 1.04,-1.09 35 | 0.52,-0.25 36 | 0.86,-0.34 37 | 1.78,0.31 38 | 0.77,-1.41 39 | 1.33,-0.43 40 | 0.86,-0.95 41 | 0.42,2.1 42 | 1.68,-0.04 43 | 0.92,-0.3 44 | 1.56,-0.52 45 | 0.98,0.05 46 | 0.43,0.1 47 | 1.62,0.34 48 | -0.01,-0.4 49 | 0.57,0.61 50 | 0.21,1.04 51 | 1.55,0.22 52 | 0.51,0.43 53 | 1.54,-1.03 54 | 1.62,-0.03 55 | 1.07,0.1 56 | 0.28,0.02 57 | 1.69,-1.23 58 | 1.41,1.25 59 | 1.58,-0.98 60 | 0.78,-0.3 61 | 1.53,0.69 62 | 0.47,2.26 63 | 1.24,0.1 64 | 0.06,0.71 65 | 0.7,0.22 66 | -0.61,-0.07 67 | 1.07,0.44 68 | 1.25,0.12 69 | 1.15,0.08 70 | 1.35,-1.07 71 | 0.14,1.22 72 | 0.69,-1.13 73 | 0.64,-0.28 74 | 1.02,1.94 75 | 0.91,1.61 76 | 1.1,-0.66 77 | 0.54,-1.9 78 | 0.54,0.72 79 | 1.97,-0.34 80 | 1.78,0.51 81 | 0.85,-0.27 82 | 0.55,-1.63 83 | 1.72,-0.73 84 | 0.23,-0.08 85 | 0.51,-0.15 86 | 0.8,0.85 87 | -0.13,-0.5 88 | 1.07,1.4 89 | 1.98,-1.36 90 | -0.23,-1.39 91 | 0.2,-0.51 92 | 0.93,-0.48 93 | 1.46,-0.33 94 | 0.85,-0.91 95 | 1.14,0.44 96 | 0.58,-1.35 97 | 2.35,0.61 98 | 1.03,1.68 99 | 0.64,-1.08 100 | 1.53,-0.81 101 | 1.01,0.19 102 | 0.89,-1.53 103 | 0.26,-0.61 104 | 1.42,-0.87 105 | 0.77,0.33 106 | 0.5,1.79 107 | 1.33,-1.04 108 | 0.62,1 109 | 1.66,0.66 110 | 0.63,0.48 111 | 0.3,-0.08 112 | 1.47,-0.87 113 | 1.02,0.29 114 | 0.9,-0.93 115 | -0.15,0.13 116 | 0.96,-0.63 117 | 1.32,-0.74 118 | 0.87,-0.06 119 | 0.78,-1.37 120 | 1.23,-0.78 121 | 0.86,1.41 122 | 0.67,-1.11 123 | 0.76,-0.69 124 | 0.93,2.56 125 | 0.61,-0.24 126 | 0.72,-0.46 127 | 1.59,1.16 128 | 0.5,-0.64 129 | 1.54,-0.83 130 | 1.6,-0.82 131 | 0.74,0.82 132 | 0.13,0.6 133 | 1.12,0.14 134 | 1.33,0.01 135 | 1.53,-0.16 136 | 0.92,-0.01 137 | 1.46,1.1 138 | 0.36,0.55 139 | 0.87,0.88 140 | 0.27,0.89 141 | 0.62,-0.56 142 | 0.85,0.2 143 | 0.96,-0.66 144 | 0.86,-0.26 145 | 0.86,0.96 146 | 1.17,2.82 147 | 1.77,-0.39 148 | 0.45,0.48 149 | 0.99,0.87 150 | 1.18,0.69 151 | 1.16,-0.05 152 | 0.64,-0.39 153 | 1,-0.09 154 | 1.04,-0.78 155 | 1.11,-1.75 156 | 1.52,0.91 157 | 0.05,-0.57 158 | 1,-0.45 159 | 0.5,-0.85 160 | 1.29,-1.58 161 | 1.72,-0.88 162 | 1.88,-0.93 163 | 0.91,0.36 164 | 0.28,2.05 165 | 1.31,-0.21 166 | 0.75,0.2 167 | 1.33,-0.45 168 | 0.9,-0.9 169 | 1.16,0.11 170 | 0.68,1.91 171 | 0.32,0.19 172 | -0.07,-0.91 173 | 1.62,0 174 | 0.28,-0.72 175 | 2.43,0.8 176 | 0.84,0 177 | 1.13,0.27 178 | 0.91,-0.55 179 | 0.41,0.46 180 | 0.3,1.74 181 | 0.62,0.38 182 | 1.21,-0.57 183 | 0.54,-0.53 184 | 1.77,-0.53 185 | 1.3,-0.51 186 | 1.12,1.9 187 | 1.06,1.99 188 | 0.59,0.28 189 | 0.72,0.66 190 | 1,0.05 191 | 1.03,2.31 192 | 1.48,0.16 193 | 2.29,0.28 194 | 1.65,0.56 195 | 0.88,-0.52 196 | 0.92,-2.28 197 | 1.39,-0.34 198 | 1.14,-3.46 199 | 0.78,-1.55 200 | 1.35,0.89 201 | 0.7,-1.5 202 | 0.31,-0.52 203 | 0.61,0.57 204 | 0.25,0.81 205 | 0.31,-0.25 206 | 1.2,-0.39 207 | 0.57,1.29 208 | 0.67,1.25 209 | 0.53,0.09 210 | 1.97,1.74 211 | 0.4,0.89 212 | 0.91,-2.31 213 | 0.12,-1.82 214 | 0.81,-1.9 215 | 0.15,-0.06 216 | 1.65,1.2 217 | 0.8,2.87 218 | 0.87,-0.13 219 | 0.73,-0.7 220 | 0.71,0.2 221 | 0.73,-0.33 222 | 0.29,1.14 223 | 1.86,-0.76 224 | 0.9,0.8 225 | 1.19,-0.5 226 | 0.71,-0.49 227 | 0.74,-1.47 228 | 1.76,-0.38 229 | 0.36,0.16 230 | 0.61,0.22 231 | 0.03,0.94 232 | 1.45,0.98 233 | 0.7,-1.29 234 | 1.32,-0.04 235 | 0.66,1.92 236 | 0.45,0.74 237 | 1.02,-0.65 238 | 0.11,-0.44 239 | 0.97,-0.92 240 | 0.89,-0.45 241 | 0.86,-2.15 242 | 0.81,0.67 243 | 0.09,0.26 244 | 1.14,-0.47 245 | 0.87,1.06 246 | 0.86,2.5 247 | 1.13,-0.37 248 | 0.88,-0.77 249 | 1.17,0.09 250 | 1.54,0.13 251 | 1.3,-1.02 252 | 0.9,-0.65 253 | 1.76,0.11 254 | 0.99,-0.19 255 | 1.1,-0.92 256 | 0.56,0.52 257 | 0.98,0.05 258 | 0.85,-0.96 259 | 0.82,-0.17 260 | 2.43,0.16 261 | 0.88,1.59 262 | 0.66,0.99 263 | 1.24,-0.24 264 | -0.03,0.03 265 | 0.7,1.51 266 | 1.56,0.95 267 | 1.06,0.21 268 | 1.9,0.05 269 | 0.7,1.79 270 | 0.31,-1.77 271 | 0.45,0.07 272 | 0.83,1.41 273 | 1.39,0.6 274 | 1.26,1.04 275 | 0.7,0.31 276 | 1.63,-0.42 277 | 0.43,-1.2 278 | 0.57,0.69 279 | 0.52,0.13 280 | 1.43,1.88 281 | 1.31,1.01 282 | 1.18,0.11 283 | 0.82,-0.41 284 | 1.16,-0.37 285 | 0.79,0.85 286 | 0.95,0.25 287 | 1.03,-0.58 288 | 1.44,0.94 289 | 1.01,-0.28 290 | 1.98,0.84 291 | 0.89,-0.9 292 | 1.46,0.88 293 | 0.73,1.46 294 | 1.17,-3.55 295 | -0.18,-0.06 296 | 0.35,-1.14 297 | 1.76,0.24 298 | 1.11,-2.08 299 | 0.76,-0.78 300 | 1.04,0.6 301 | 1.33,0.87 302 | -0.81,0.72 303 | 1.53,0.92 304 | 1.8,2.35 305 | 1.06,0.57 306 | 1.34,-0.2 307 | 0.54,0.19 308 | 1.75,-0.63 309 | 1.56,0.2 310 | 1.22,-0.12 311 | 1.55,0.09 312 | 0.33,0.36 313 | 0.14,-0.65 314 | 0.35,-0.35 315 | 1.31,1.02 316 | 1.09,-0.29 317 | 0.34,-0.09 318 | 0.55,1.47 319 | 1.59,1.31 320 | 1.55,0.64 321 | 1.38,-1.54 322 | 0.75,1.03 323 | 0.69,-0.81 324 | 0.96,0.04 325 | 0.92,-1.57 326 | 1.19,-0.18 327 | 1.59,-0.59 328 | 1.5,0.13 329 | 1.01,0.34 330 | -0.1,1.65 331 | 1.48,1.25 332 | 1.88,-0.73 333 | 1.64,0.32 334 | 1.41,0.88 335 | 0.45,1.99 336 | 0.88,-2.68 337 | 1.35,0.64 338 | 1.22,-0.1 339 | 0.79,-1.15 340 | 1.29,-0.42 341 | 0.34,0.78 342 | 1.31,-0.77 343 | 0.31,-1.32 344 | 1.06,2.13 345 | 0.52,0.12 346 | 1.13,-1.31 347 | 1.54,2.43 348 | 1.37,0.52 349 | 0.62,0.93 350 | 0.87,0.84 351 | 0.8,-0.84 352 | 0.86,-0.33 353 | 0.28,0.87 354 | 0.84,-0.08 355 | 1.12,0.05 356 | 0.26,-0.91 357 | 0.58,1.93 358 | 0.95,-0.06 359 | 1.05,-0.52 360 | 1.64,-0.55 361 | 0.88,1.33 362 | 0.43,1.1 363 | 1.27,-0.85 364 | 1.2,2.6 365 | 0.63,-0.39 366 | 1.59,-2.96 367 | 1.13,1.17 368 | 0.83,0.99 369 | 1.24,0 370 | 1.14,-0.88 371 | 1.81,1.16 372 | 0.39,0.89 373 | 0.86,0 374 | 0.28,0.61 375 | 1,0.7 376 | 0.35,-0.38 377 | 0.1,1.07 378 | 0.9,-1.26 379 | 1.53,-0.49 380 | -0.06,0.08 381 | 1.61,0.16 382 | 1.64,-1.13 383 | 1.06,1.15 384 | 1.56,0.74 385 | 1.82,1.98 386 | 0.3,-1.67 387 | 1.37,1.46 388 | 0.21,1.28 389 | 1.61,0.96 390 | 1.49,-0.85 391 | 1.1,-1.74 392 | 1.76,0.45 393 | 1.31,-0.58 394 | 1.43,-0.65 395 | 0.92,-1.28 396 | 1.27,-1.57 397 | 1.02,-1.28 398 | 1.36,1.06 399 | 0.82,0.37 400 | 0.68,0.46 401 | 1.15,0.08 402 | 1.38,-0.84 403 | 1.18,0.27 404 | 0.18,-1.49 405 | 0.58,0.67 406 | 1.67,-0.69 407 | 1.48,-0.38 408 | 0.58,1.12 409 | 0.28,0.64 410 | 0.58,-1.73 411 | 0.91,0.83 412 | 0.15,0.67 413 | 0.02,1.35 414 | 1.06,-1.36 415 | 1.33,0.57 416 | 1.45,0.43 417 | 1,-0.42 418 | 0.81,-0.02 419 | -0.09,0.49 420 | 0.62,-0.62 421 | 1.33,0.31 422 | 0.84,0.14 423 | 0.46,-1.71 424 | 0.34,-0.03 425 | 0.79,-0.86 426 | 0.38,-0.43 427 | 1.15,1.23 428 | 0.41,-0.03 429 | 1.02,1.09 430 | 1.29,-1.68 431 | 0.86,0.4 432 | 0.31,0.38 433 | 1.41,-1.21 434 | 1.3,-1.5 435 | 0.82,-0.9 436 | 1.63,0.44 437 | 0.71,-0.12 438 | 0.74,0.97 439 | 1.12,-0.01 440 | 0.79,1.06 441 | 1.4,-1.09 442 | 0.6,-0.42 443 | 0.55,0.72 444 | 0.01,0.93 445 | 1.65,0.61 446 | 0.38,-1.76 447 | -0.13,0.1 448 | 1.14,-0.36 449 | 1.69,0.23 450 | -0.46,0.31 451 | 0.48,-0.17 452 | 0.12,-0.3 453 | 0.74,1.61 454 | 0.32,0.19 455 | 0.9,0.34 456 | 0.53,-1.07 457 | 0.41,-1.65 458 | 1.26,-1.1 459 | 0.21,-0.98 460 | 0.17,1.47 461 | 0.54,1.04 462 | 0.8,-0.43 463 | 1.15,0.68 464 | 0.93,0.67 465 | 0.35,-0.32 466 | 1.46,-0.83 467 | 1.89,-0.9 468 | 0.61,-0.28 469 | 0.82,0.47 470 | 1.67,0.02 471 | 1.3,0.02 472 | 1.38,-0.66 473 | 1.32,-0.91 474 | 0.32,-0.71 475 | 0.78,2.16 476 | 1.11,-0.53 477 | 0.81,-0.48 478 | 1.61,-0.01 479 | 0.94,1.36 480 | 1.13,-0.08 481 | 1.53,0.48 482 | 0.75,1.27 483 | 0.74,-0.13 484 | 0.32,0.29 485 | 1.19,0.25 486 | 1.01,1.06 487 | 1.07,0.29 488 | 1.04,1.58 489 | -0.02,1.15 490 | 1.42,0.51 491 | 1.66,0.86 492 | 1.35,-0.1 493 | 1.33,0.02 494 | 1.13,0.88 495 | 2.11,1.14 496 | 0.8,-1.1 497 | 0.23,-0.07 498 | 1.2,0.31 499 | 0.99,0.92 500 | 1.2,-1 501 | 0.4,0 502 | 0.8,-0.3 503 | 1.29,-0.88 504 | 0.36,1.61 505 | 0.82,-0.36 506 | 0.48,-0.03 507 | 0.33,0.68 508 | 1.19,-1.4 509 | 0.58,1.24 510 | 1.25,2.08 511 | 1.16,-0.78 512 | 0.16,-1.31 513 | 1.06,0.33 514 | 1.06,0.96 515 | 1.04,-2.18 516 | 1.57,-0.47 517 | 1.14,-0.91 518 | 0.81,1.01 519 | 0.28,-0.8 520 | 0.87,0.33 521 | 1.11,-0.43 522 | 1.23,-0.19 523 | 0.71,1.58 524 | 1.31,0.28 525 | 0.55,-0.24 526 | 1.12,1.03 527 | 0.62,-0.45 528 | 1.5,1.87 529 | 0.02,-0.04 530 | 0.63,0.53 531 | 1.32,1.16 532 | 0.63,-1.53 533 | 0.79,0.21 534 | 1.31,0.59 535 | 1.13,-0.39 536 | 0.49,-0.19 537 | -0.13,-0.59 538 | 0.91,0.71 539 | 1.39,-1.22 540 | 1.43,-0.05 541 | 0.77,-0.59 542 | 0.77,-0.94 543 | 0.93,0 544 | 0.95,-0.55 545 | 0.83,0.07 546 | 1.37,0.07 547 | 1.64,0.61 548 | 0.23,1.23 549 | 1.71,0.83 550 | 0.89,-0.79 551 | 0.9,-0.89 552 | 1.34,0.62 553 | 1.58,-1.69 554 | 1,-0.9 555 | 0.72,0.24 556 | 2.02,0.12 557 | 0.37,-0.04 558 | 0.61,1.21 559 | 1.75,-0.43 560 | 0.97,0.04 561 | 1.1,-0.76 562 | 0.68,0.98 563 | 0.65,0.62 564 | 1.1,2.08 565 | 0.49,0.71 566 | 1.36,1.82 567 | 0.66,-0.82 568 | 0.96,1.45 569 | 1.07,-1.16 570 | 0.58,-0.72 571 | 0.68,-0.45 572 | 1.65,-1.36 573 | 1.11,1.9 574 | 1.34,-0.39 575 | 0.85,1.55 576 | 0.4,0.02 577 | 1.71,0.25 578 | 0.31,0.19 579 | 0.69,-0.46 580 | 0.93,-0.3 581 | 0.63,-0.49 582 | 1.44,1.33 583 | 1.26,1.07 584 | 0.43,1.83 585 | 0.35,-0.14 586 | 0.16,0.36 587 | -0.4,-1.47 588 | 1.18,-0.65 589 | 0.95,-1.04 590 | 0.82,-0.25 591 | 0.69,0.24 592 | 0.62,-1.13 593 | 2.12,-0.44 594 | 1.63,-0.39 595 | 1.19,1.11 596 | 0.76,0.98 597 | 1.27,-0.39 598 | -0.25,-0.87 599 | 0.77,0.32 600 | 1.18,-0.68 601 | 1.07,1.46 602 | 0.67,1.54 603 | 1.12,0.61 604 | 1.03,-1.74 605 | 0.96,0.5 606 | 1.35,-1.03 607 | 0.78,1.11 608 | 1.35,2.02 609 | 0.77,-0.08 610 | 1.06,-0.8 611 | 0.9,0.01 612 | 1.29,0.78 613 | 1.1,1.55 614 | 0.69,-0.87 615 | 1.13,1.83 616 | 0.14,2.52 617 | 0.73,-1.22 618 | 2.09,0.24 619 | 1.18,1.11 620 | 0.93,0.39 621 | 1.24,0.45 622 | 0.86,-0.84 623 | 0.8,-0.18 624 | 0.75,-1.78 625 | 1.17,-0.69 626 | 1.19,-0.02 627 | 0.39,-0.11 628 | 0.44,0.74 629 | 0.8,0.2 630 | 0.92,0.39 631 | 0.86,2.12 632 | 1.39,1.16 633 | 2.03,0.75 634 | 1.24,-0.02 635 | 0.19,0.51 636 | 0.78,0.7 637 | 0.39,1.86 638 | 0.7,0.73 639 | 1.12,-0.07 640 | 1.08,1.18 641 | 0.26,0.41 642 | 1.02,1.56 643 | 0.43,-0.7 644 | 1.28,-1.37 645 | 1.54,-1.46 646 | 0.35,-0.19 647 | 0.89,0.17 648 | 0.54,0.73 649 | 1.8,-1.04 650 | 0.6,0.59 651 | 2.04,0.87 652 | 1.08,0.36 653 | 1.57,-0.31 654 | 2.03,-2.39 655 | 0.05,0.69 656 | -0.25,-1.81 657 | -0.02,-1.34 658 | 1.14,-0.54 659 | 0.67,-1.19 660 | 1.1,-0.47 661 | 0.62,-1.36 662 | 1.39,-0.24 663 | 1.51,0.8 664 | 0.95,0.65 665 | 0.38,-0.26 666 | 1.23,0.76 667 | 1.36,1.63 668 | 1.26,2.09 669 | 1.76,0.82 670 | 0.85,-0.18 671 | 0.46,1.89 672 | 0.88,0.56 673 | 0.58,0.04 674 | 1.2,0.3 675 | 1.8,0.11 676 | 1.42,-0.84 677 | 1.5,-0.27 678 | 1.46,-1.3 679 | 0.73,-0.88 680 | 1.37,2.19 681 | 0.69,0.29 682 | 0.96,0.39 683 | 2.13,-0.67 684 | 1.25,0.37 685 | 2.27,0.04 686 | 1.54,-1.64 687 | 1.22,0.11 688 | 0.51,-1.5 689 | 1,-1.01 690 | 1.58,0.96 691 | 0.9,0.57 692 | 1.12,0.82 693 | 0.93,1.63 694 | 1.11,1.08 695 | 0.68,-0.47 696 | 0.88,0.58 697 | 1.29,-0.62 698 | 0.53,-0.19 699 | 1.21,-1.59 700 | 1.25,-0.52 701 | 0.66,0.88 702 | 1.16,-0.91 703 | 0.76,0.83 704 | 1.43,1.43 705 | 1.2,1.45 706 | 0.47,-0.92 707 | 0.55,-0.26 708 | 1.48,0.31 709 | 1.14,0.95 710 | 2.06,-0.19 711 | 0.79,-1.35 712 | 0.5,-0.49 713 | 1.43,-0.03 714 | 0.14,0.4 715 | 0.84,-1.58 716 | 1.96,-1.4 717 | 0.72,0.39 718 | 0.98,1.1 719 | 1.07,-0.24 720 | 0.79,1.43 721 | 0.96,0.42 722 | 1.34,0.22 723 | 0.79,-1.83 724 | 1.59,1.73 725 | 0.67,0.15 726 | 1,0.81 727 | 0.33,1.24 728 | 0.71,-1.52 729 | 1.11,-0.52 730 | 0.99,-0.92 731 | 0.05,-0.93 732 | 1.41,0.51 733 | 1.56,-1.35 734 | 1.68,-0.25 735 | 0.19,2.92 736 | 1.27,-1.3 737 | 0.74,0.67 738 | 1.58,-1.09 739 | 1.69,-1.22 740 | 0.74,0.58 741 | 1.56,-1.25 742 | 0.72,-0.72 743 | 1.29,-1.46 744 | 0.95,1.08 745 | 1.55,1.56 746 | 1.77,0.75 747 | 1.37,0.37 748 | 0.72,0.29 749 | 0.46,-0.73 750 | 0.78,-1.45 751 | 1.53,-0.25 752 | 0.43,0.21 753 | 0.98,0.13 754 | 1.45,-1.68 755 | 0.36,1.81 756 | 1.33,1.46 757 | 0.68,1.29 758 | 0.92,-0.96 759 | 2.14,-0.73 760 | 1.26,-0.31 761 | 1.14,0.76 762 | 1.35,0.53 763 | 1.07,-0.09 764 | 1.27,0.96 765 | 1.6,-0.15 766 | 0.12,1.28 767 | 0.45,0.44 768 | 1.04,-1.26 769 | 1.68,-1.63 770 | 1.54,1.56 771 | 0.31,0.38 772 | 0.6,-1.27 773 | 0.96,0.86 774 | 2.35,0.61 775 | 0.36,-0.68 776 | 0.48,1.7 777 | 1.06,0.54 778 | 0.76,0.43 779 | 1.86,1.52 780 | 1.82,-0.32 781 | 1.79,-0.12 782 | 1.33,0.67 783 | 1.83,-0.97 784 | 1,0.48 785 | 0.67,-0.35 786 | 1.35,-0.69 787 | 1.38,0.66 788 | 1.3,-1.09 789 | 1.74,-0.78 790 | 0.37,-0.18 791 | 1.1,-0.58 792 | 1.13,0.04 793 | 1.26,-1.64 794 | 1.39,-0.07 795 | 0.53,0.08 796 | 0.79,-0.18 797 | 0.4,-1.13 798 | 1.06,-1.17 799 | 0.91,-0.39 800 | 1.07,0.15 801 | 0.69,1.23 802 | 1.02,1.02 803 | 1.04,0.28 804 | 1.69,0.73 805 | 2.11,-0.04 806 | 1.34,1.52 807 | 1.02,-0.42 808 | 0.67,0.63 809 | 1.61,1.47 810 | 1.41,-0.07 811 | 0.35,0.58 812 | 0.21,0.51 813 | 0.33,-0.11 814 | 0.43,-0.5 815 | 0.87,0.54 816 | 1.19,-1.55 817 | 1.07,-0.07 818 | 0.27,-0.63 819 | 0.51,0.76 820 | 1.57,-1.19 821 | 0.75,1.09 822 | 0.77,0.29 823 | 0.38,0.38 824 | 1.18,2.01 825 | 1.3,1.69 826 | 0.34,-0.53 827 | 1.09,-0.02 828 | 1.28,1.48 829 | 1.34,-0.99 830 | 1.08,0.89 831 | 1.15,-0.01 832 | 0.94,0.5 833 | 1.93,0.37 834 | 1.39,0.09 835 | 0.22,0.7 836 | 0.74,-0.08 837 | 1,-0.84 838 | 0.13,-1.39 839 | 0.37,0.48 840 | 0.4,0.74 841 | 0.99,-0.91 842 | 1.2,0.76 843 | 0.2,-0.04 844 | 1.13,-0.64 845 | 0.75,0.57 846 | 0.19,-0.84 847 | 2.09,0.61 848 | 0.93,1.42 849 | 1.31,-1.56 850 | 1.65,-0.37 851 | 1.68,-0.9 852 | 1.65,0.84 853 | 1.5,1.33 854 | -0.04,-0.89 855 | 1.71,-0.54 856 | 1.89,0.89 857 | 0.65,0.31 858 | 0.72,-0.2 859 | 1.1,-0.59 860 | 0.34,-0.6 861 | 0.88,-0.06 862 | 0.58,0.69 863 | 0.85,-0.47 864 | 1.45,-0.38 865 | 0.29,-0.96 866 | 0.63,-1.26 867 | 0.19,0.83 868 | 1.09,1.2 869 | 0.94,-1.23 870 | 1.22,0.6 871 | 1.64,0.08 872 | 1.14,-0.74 873 | 0.84,-1.37 874 | 0.35,1.59 875 | 1.46,0.19 876 | 1.42,-0.68 877 | 1.63,0.45 878 | 0.15,2.4 879 | 1.7,-0.66 880 | -0.17,-0.91 881 | 0.95,1.03 882 | 0.52,1.83 883 | 1.44,0.04 884 | 0.95,1.22 885 | 1.05,1.48 886 | 1.23,-1.33 887 | 0.75,-0.1 888 | 0.76,-2.2 889 | 0.95,-0.52 890 | 0.76,-0.69 891 | 1.03,0.35 892 | 1.04,-0.12 893 | 0.95,1.24 894 | 0.83,0.65 895 | 0.53,0.18 896 | 0.93,-1.59 897 | 1.14,-1.13 898 | 1.97,-1.95 899 | 0.73,0.13 900 | 1.38,-1.46 901 | 0.61,-0.99 902 | 1.2,1.24 903 | 1.78,-1.79 904 | 0.37,0.32 905 | 1.37,0.09 906 | 0.94,-1.18 907 | 1.2,-0.71 908 | -0.14,1.06 909 | 0.69,-1.06 910 | 0.55,-2.28 911 | 0.42,-0.6 912 | 0.19,1.42 913 | 1.39,-0.83 914 | 0.65,-1.41 915 | 0.55,-1.16 916 | 1.84,0.78 917 | 1.27,-1.59 918 | -0.11,-2.24 919 | 0.56,-1.27 920 | 1.19,-0.78 921 | 1.79,0.88 922 | 0.64,-0.61 923 | 0.85,-1.13 924 | 0.61,-0.63 925 | 1.23,-0.49 926 | 0.96,-1.21 927 | 0.39,1.3 928 | 1.02,-2.15 929 | 0.53,1.3 930 | 0.97,-0.72 931 | 1.1,0.74 932 | 0.23,1.06 933 | 0.72,-0.81 934 | 1.71,-0.19 935 | 0.42,0.17 936 | 1.36,1.14 937 | 0.99,-1.03 938 | 0.73,-2.01 939 | 0.58,0.85 940 | 0.29,1.68 941 | 0.86,-0.91 942 | 0.15,-0.45 943 | 2.53,0.99 944 | 1.52,-0.98 945 | 0.51,1.07 946 | 0.85,-0.27 947 | 1.02,1.03 948 | 1.27,-0.54 949 | 0.72,0.17 950 | 1.97,0.03 951 | 0.3,0.06 952 | 0.17,2.33 953 | 1.17,0.19 954 | 1.14,0.05 955 | 1.6,2.28 956 | 1.41,-1.15 957 | 1.18,-2.51 958 | 0.89,0.48 959 | 0.91,-0.48 960 | 1.37,-0.55 961 | 1.16,-1.97 962 | 0.57,0.67 963 | 0.67,-1.78 964 | 1.18,0.89 965 | 1.47,0.2 966 | 0.21,0.09 967 | 1.85,-1.41 968 | 1.04,-0.14 969 | 0.19,0.81 970 | 1.01,-1.2 971 | 0.58,1.08 972 | 1.18,2.53 973 | 1.22,0.16 974 | -0.1,0.13 975 | 0.71,0.77 976 | 1.16,0.61 977 | 1.31,-0.06 978 | 1.82,-0.2 979 | 0.28,-0.2 980 | 1.32,-1.4 981 | 0.89,0.11 982 | 0.89,1.12 983 | 1.37,-0.45 984 | 1.34,-0.68 985 | 0.37,-0.82 986 | 0.17,0.69 987 | 1.13,-0.61 988 | 0.99,-0.67 989 | 0.47,0.66 990 | -0.07,0.13 991 | 0.84,0.4 992 | 0.62,2.29 993 | 0.2,0.18 994 | 1.38,0.42 995 | 0.64,1.13 996 | 0.57,0.89 997 | 1.32,-0.51 998 | 0.48,2.35 999 | 1.18,0.63 1000 | 0.24,-0.28 1001 | 1.2,-0.88 1002 | ,-0.65 1003 | ,0.46 1004 | ,0.98 1005 | ,0.03 1006 | ,0.99 1007 | ,-0.03 1008 | ,0.8 1009 | ,-1.2 1010 | ,0.64 1011 | ,-0.54 1012 | ,-1.31 1013 | ,-0.71 1014 | ,-0.62 1015 | ,0.36 1016 | ,-1.35 1017 | ,-0.64 1018 | ,-0.03 1019 | ,-1.63 1020 | ,0.48 1021 | ,0.3 1022 | ,-0.19 1023 | ,-0.93 1024 | ,-0.43 1025 | ,0.22 1026 | ,-1.45 1027 | ,-0.1 1028 | ,-0.71 1029 | ,0.88 1030 | ,-1.02 1031 | ,1.27 1032 | ,-1.48 1033 | ,-0.84 1034 | ,1.69 1035 | ,1.03 1036 | ,-1 1037 | ,1.74 1038 | ,0.44 1039 | ,0.32 1040 | ,-0.46 1041 | ,-0.65 1042 | ,-0.06 1043 | ,-0.05 1044 | ,0.47 1045 | ,1.34 1046 | ,-0.26 1047 | ,-1.25 1048 | ,-0.58 1049 | ,-0.85 1050 | ,-0.75 1051 | ,0.59 1052 | ,-0.67 1053 | ,-0.27 1054 | ,-2.22 1055 | ,0.78 1056 | ,-0.16 1057 | ,-2.08 1058 | ,0.63 1059 | ,0.01 1060 | ,-0.95 1061 | ,-0.05 1062 | ,0.11 1063 | ,0.33 1064 | ,-0.71 1065 | ,0.15 1066 | ,0.42 1067 | ,0.43 1068 | ,-1.31 1069 | ,0.23 1070 | ,-0.99 1071 | ,0.92 1072 | ,-0.41 1073 | ,1.08 1074 | ,-0.58 1075 | ,-1.54 1076 | ,-0.21 1077 | ,-0.61 1078 | ,-1.22 1079 | ,-0.91 1080 | ,-0.22 1081 | ,0.43 1082 | ,-1.29 1083 | ,0.42 1084 | ,-0.29 1085 | ,0.2 1086 | ,0.11 1087 | ,0.28 1088 | ,0.2 1089 | ,-2.04 1090 | ,-0.95 1091 | ,-0.2 1092 | ,0.36 1093 | ,-0.79 1094 | ,0.78 1095 | ,-0.13 1096 | ,-0.33 1097 | ,0.31 1098 | ,-0.76 1099 | ,0.9 1100 | ,-0.16 1101 | ,1.18 1102 | -------------------------------------------------------------------------------- /jupyter/plot-examples.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "6b301dd5-6e2e-4798-9f7b-d798ad0e51f4", 7 | "metadata": { 8 | "tags": [] 9 | }, 10 | "outputs": [], 11 | "source": [ 12 | "# Run this cell to enable interative plot view\n", 13 | "%matplotlib widget" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": 2, 19 | "id": "39fbe9b3-fbfa-43d3-9ee2-305ec3ce263a", 20 | "metadata": { 21 | "tags": [] 22 | }, 23 | "outputs": [], 24 | "source": [ 25 | "import matplotlib.pyplot as plt\n", 26 | "import numpy as np\n", 27 | "\n", 28 | "from cycler import cycler\n", 29 | "from matplotlib import patches" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 3, 35 | "id": "d615f28a-522c-4649-9933-e1c41d966e84", 36 | "metadata": { 37 | "tags": [] 38 | }, 39 | "outputs": [], 40 | "source": [ 41 | "# Reload all modules (except those excluded by %aimport) every time before executing the Python code typed.\n", 42 | "# https://ipython.org/ipython-doc/3/config/extensions/autoreload.html\n", 43 | "%load_ext autoreload\n", 44 | "%autoreload 2" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": 4, 50 | "id": "9b267e5b-f5ba-4245-bdb0-9a05fbc07894", 51 | "metadata": { 52 | "tags": [] 53 | }, 54 | "outputs": [], 55 | "source": [ 56 | "# Run this to close all figures\n", 57 | "plt.close(\"all\")" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": 5, 63 | "id": "4ba673ba-2843-4d4a-b5c7-d0ee56617530", 64 | "metadata": { 65 | "tags": [] 66 | }, 67 | "outputs": [], 68 | "source": [ 69 | "## Global configuration\n", 70 | "\n", 71 | "# constrained_layout automatically adjusts subplots and decorations like legends and colorbars\n", 72 | "# so that they fit in the figure window while still preserving, as best they can, the logical\n", 73 | "# layout requested by the user. constrained_layout is similar to tight_layout, but uses a constraint\n", 74 | "# solver to determine the size of axes that allows them to fit.\n", 75 | "plt.rcParams[\"figure.constrained_layout.use\"] = True\n", 76 | "\n", 77 | "plt.rcParams['figure.figsize'] = [4.0, 3.0]\n", 78 | "plt.rcParams['figure.dpi'] = 80\n", 79 | "plt.rcParams['savefig.dpi'] = 100\n", 80 | "\n", 81 | "plt.rcParams['font.size'] = 12\n", 82 | "plt.rcParams[\"font.family\"] = \"Arial\"\n", 83 | "plt.rcParams['legend.fontsize'] = 'large'\n", 84 | "plt.rcParams['figure.titlesize'] = 'medium'\n", 85 | "\n", 86 | "plt.rcParams['axes.prop_cycle'] = cycler(color='bgrcmyk')" 87 | ] 88 | }, 89 | { 90 | "cell_type": "code", 91 | "execution_count": 6, 92 | "id": "191f4554-faae-47bb-b2bb-3f419fcb1cc3", 93 | "metadata": { 94 | "tags": [] 95 | }, 96 | "outputs": [ 97 | { 98 | "data": { 99 | "text/plain": [ 100 | "Text(0.5, 1.0, 'Sine wave')" 101 | ] 102 | }, 103 | "execution_count": 6, 104 | "metadata": {}, 105 | "output_type": "execute_result" 106 | }, 107 | { 108 | "data": { 109 | "application/vnd.jupyter.widget-view+json": { 110 | "model_id": "1b2c719cdb644415835b3b73b58df213", 111 | "version_major": 2, 112 | "version_minor": 0 113 | }, 114 | "image/png": "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", 115 | "text/html": [ 116 | "\n", 117 | " <div style=\"display: inline-block;\">\n", 118 | " <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n", 119 | " Figure\n", 120 | " </div>\n", 121 | " <img src='data:image/png;base64,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' width=320.0/>\n", 122 | " </div>\n", 123 | " " 124 | ], 125 | "text/plain": [ 126 | "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" 127 | ] 128 | }, 129 | "metadata": {}, 130 | "output_type": "display_data" 131 | } 132 | ], 133 | "source": [ 134 | "x = np.arange(0, 4, 0.05)\n", 135 | "y = np.sin(x*np.pi)\n", 136 | "\n", 137 | "fig, ax = plt.subplots()\n", 138 | "ax.plot(x, y)\n", 139 | "ax.set_xlabel('t [s]')\n", 140 | "ax.set_ylabel('S [V]')\n", 141 | "ax.set_title('Sine wave')" 142 | ] 143 | }, 144 | { 145 | "cell_type": "code", 146 | "execution_count": null, 147 | "id": "91d945cc-1a82-4abf-ad3c-5467ff68ad91", 148 | "metadata": { 149 | "tags": [] 150 | }, 151 | "outputs": [], 152 | "source": [] 153 | } 154 | ], 155 | "metadata": { 156 | "kernelspec": { 157 | "display_name": "Python 3 (ipykernel)", 158 | "language": "python", 159 | "name": "python3" 160 | }, 161 | "language_info": { 162 | "codemirror_mode": { 163 | "name": "ipython", 164 | "version": 3 165 | }, 166 | "file_extension": ".py", 167 | "mimetype": "text/x-python", 168 | "name": "python", 169 | "nbconvert_exporter": "python", 170 | "pygments_lexer": "ipython3", 171 | "version": "3.11.4" 172 | } 173 | }, 174 | "nbformat": 4, 175 | "nbformat_minor": 5 176 | } 177 | --------------------------------------------------------------------------------