mecobalamin’s diary

人間万事塞翁が馬

https://help.hatenablog.com/entry/developer-option

JBrowseをDockerで動かす、その4、JBrowseのインストール

続きです
mecobalamin.hatenablog.com

ボリュームのJBrowseにJBrowseをインストールする
名前を一緒にしてしまってややこしい

以下のコマンドでマウントしているものとする

$ docker run --rm -v /e/hoge:/tmp/fuga -v JBrowse:/usr/share/nginx/html/ -it --name jbrowse jbrowse

まずJBrowseのアーカイブのダウンロード
JBrowse · A fast, embeddable genome browser built with HTML5 and JavaScript
ここからリンクをたどって最新版をインストールする
今回は1.16.10-devを使う
https://github.com/GMOD/jbrowse/archive/1.16.10-release.zip
コンテナを削除するとアーカイブも消えるので
マウントしたwindowsディレクトリに保存する
jbrowseのコンテナで以下のコマンドを実行する

$ cd /tmp/fuga
$ wget https://github.com/GMOD/jbrowse/archive/1.16.10-release.zip

ダウンロードが済んだらアーカイブ
Docker内のディレクトリに移動して展開する
windowsディレクトリで展開すると所有権がrootではない
実際どのような問題があるかわからないが気持ち悪いので移動後に展開している

展開したディレクトリを/usr/share/nginx/htmlに移動し
インストールシェルスクリプトsetup.shを実行する
使ったコマンドは以下の通り

$ cd /tmp
$ cp ./fuga/jbrowse-1.16.10-release.zip ./
$ unzip jbrowse-1.16.10-release.zip
$ mv ./jbrowse-1.16.10-release /usr/share/nginx/html/jbrowse
$ cd /usr/share/nginx/html/jbrowse/
$ ./setup.sh

次のようなメッセージが表示されたらインストール成功

Gathering system information ...done.
NOTE: Legacy scripts wig-to-json.pl and bam-to-json.pl have been removed from setup. Their functionality has been superseded by add-bam-track.pl and add-bw-track.pl. If you require the old versions, please use JBrowse 1.12.3 or earlier.
Installing node.js dependencies and building with webpack ...done.
Installing Perl prerequisites ...done

Formatting Volvox example data ...done.
To see the volvox example data, browse to http://your.jbrowse.root/index.html?data=sample_data/json/volvox.

Formatting Yeast example data ...done.
To see the yeast example data, browse to http://your.jbrowse.root/index.html?data=sample_data/json/yeast.

次はNginxを起動してインストールされたデモデータをブラウザから確認する

続きます。

JBrowseをDockerで動かす、その3、Dockerfileのbuild

続きです
mecobalamin.hatenablog.com

JBrowseをインストールする環境を
DockerのUbuntuに作成する
作成にはDockerfileを利用する

以下のような内容のテキストファイルを
ファイル名をDockerfileとして
任意のディレクトリに保存する

FROM ubuntu:latest

RUN apt-get update && \
apt-get install -y tzdata && \
apt-get install -y wget less unzip \
            nodejs npm git \
            build-essential libpng-dev zlib1g-dev libgd-dev

一行目のFROMで最新のUbuntuイメージをダウンロードする
二行目のRUN以降はコマンドのインストールをしている
改行(&&\または\)されているが一行の命令として実行される
これはDockerのレイヤーを必要以上に作らせないための措置

apt-get installを使うとタイムゾーンの入力を求められることがある
それを避けるためにtzdataをインストールする
ただしコンテナのタイムゾーンUTCになるので必要ならJSTに変更する

$ ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

wgetとlessとunzipはubuntu実行後にコマンドのインストールに使う
nodejs/npm/gitはJBrowseのインストールシェルスクリプトを実行すると要求される
libpng-dev zlib1g-dev libgd-devはJBrowseのTrouble shootingに
載っていたのでインストールする

JBrowse requires a few fundamental prerequisites that it cannot install itself: these are libpng, zlib, libgd, make, a C compiler, and a C++ compiler.

JBrowse Troubleshooting - GMOD


次にDockerfileを保存したディレクトリで
Dockerfileのビルドを行う

$ docker build --network host -f Dockerfile . -t jbrowse

networkオプションでホストのネットワークを利用できる
docker image build時に、DNSの設定をなんとかしたい - CLOVER🍀
出力されるimageの名前はjbrowseになる

以下のようにコンテナを起動する

$ docker run --rm -v /e/hoge:/tmp/fuga -v JBrowse:/usr/share/nginx/html/ -it --name jbrowse jbrowse

rmオプションでコンテナ終了時に自動でコンテナを削除する
vオプションでマウント元と先を指定する
この場合2つあるが1つ目は
wslの/e/hogeをdockerの/tmp/fugaにマウントしている
2つ目はDockerで作ったボリュームのJBrowseを
Dockerの/usr/share/nginx/htmlにマウントしている


Dockerfileのビルドのときにapt-getを失敗することがある
ホストのDNSを設定し直すと解決する
設定ファイルは/etc/resolv.conf

$ sudo vim /etc/resolv.conf

以下のサーバーを追記する

nameserver 8.8.8.8

いまのところ/etc/resolv.confはなにかのタイミングで
更新されて追記した分が消えることがある
resolv.confに以下のように書かれているので
試してみたら保持されるかも
(まだ試してない)

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false

docker-machine.exeを再起動すると
解決する場合もあった

続きます

JBrowseをDockerで動かす、その2、Docker volumeの作成

続きです
mecobalamin.hatenablog.com

JBrowse本体とBamファイルはDockerのボリュームに保存する
Dockerのボリュームとは

ボリュームとは、Docker コンテナーにおいて生成され利用されるデータを、永続的に保持する目的で利用される仕組みです。

ボリュームの利用 | Docker ドキュメント

JBrowseという名前のボリュームを作成する

$ docker volume create JBrowse

ストレージなので異なるコンテナから
マウントできるしコンテナを停止しても
ボリュームのデータは消えない
最大サイズがどうなっているか
よくわからないけどVM
ストレージサイズになるのだろうか?

ボリュームの確認はdocker volume lsを使う

$ docker volume ls
DRIVER              VOLUME NAME
local               JBrowse


続きます

JBrowseをDockerで動かす、その1、VMの作成とネットワーク設定

DockerのUbuntuにJBrowseをインストールし
Nginxを使ってローカルネットワークで
bamファイルを共有する
JBrowseはDockerの永続ボリュームである
Docker volume上にインストールする

メリットはなんだろう

コンテナ間でファイルの共有しつつ
そのファイルをローカルネットワークから参照するのに
ちょうどよい例題になりそうだったから試してみた、
というのが正直なところ
なんとなく応用が効きそう


手順は以下の通り

  1. Virtual Machine(VM)の作成とネットワーク設定(この記事)
  2. Docker Volumeの作成
  3. Dockerfileのbuild
  4. JBrowseのインストール
  5. Nginxの起動とJBrowseへのアクセス
  6. Bamファイルの登録
  7. イメージの作成

まずVirtual Machine(VM)の作成とネットワーク設定をする

JBrowseをインストール後に
BamファイルをJBrowseに登録するが
その時メモリ/ストレージを消費するようだ
デフォルトのメモリ/ストレージサイズだと失敗した
そこでメモリとストレージサイズを
デフォルトより大きくした
hogehogeというVMを作成する

$ docker-machine.exe create --driver virtualbox --virtualbox-disk-size "120000" --virtualbox-memory "16384" hogehoge

hogehogeは起動/シャットダウンにVMの名前をつける

$ docker-machine.exe start hogehoge
$ docker-machine.exe stop hogehoge

VMの名前がdefaultの場合だといらないのでやや面倒
既存のdefaultを消して新しくdefaultのVM
作り直すという手もあるが
この場合内部のimageも消えてしまう
(実際消えてしまいimageを復活できずに困った)

既存のVMを消して新規に作る場合は
以下のコマンドを使う

$ docker-machine.exe rm default 
$ docker-machine.exe create --driver virtualbox --virtualbox-disk-size "120000" --virtualbox-memory "16384" default

なおVMはwslから作る
VirtualBoxからも作成できるが
wslからアクセスする方法がわからなかった

次に作成したVMをローカルネットワーク上に公開するために
ポートフォワーディングの設定をする
こちらのサイトを参考にした
Dockerにubuntuをインストール後、nginxを入れてサイトを表示したい。|むく|note

VIrturalBoxの場合、使用するVM(hogehogeまたはdefault)を選択し
[設定] -> [ネットワーク]にあるアダプターから行う
いくつかアダプターのタブがあるが
NATに割り当てられているアダプターを使う

[高度]の[ポートフォワーディング]をクリックすると
[ポートフォワーディング ルール]というウィンドウが現れる
ウィンドウ右側のボタンでルールを追加し
ホストポートに"8000"、ゲストポートに"8080"を追加する
名前は任意で良さそう
f:id:mecobalamin:20201010200429p:plain

最後にホストOS(Windows10)とゲストOS(wsl)との間で
ファイルの遣り取りをするために
共有フォルダーの設定をする
詳しくはこの記事を参照してもらいたい
mecobalamin.hatenablog.com

VirtualBoxのdefaultのVMを選択する
[設定] -> [共有フォルダー]を選び
右のボタンで共有するフォルダーを追加する
Eドライブを追加する場合は
フォルダーのパスをe:\
フォルダー名をeとする
[自動マウント]と[永続化する]にチェックを入れる
f:id:mecobalamin:20201010200537p:plain

通常、windowsディレクトリは
wslの/mnt/にマウントされる
これをルート/にマウントするように変更する
そのために/etc/wsl.confに以下のように書き込んだ

[automount]
root = "/"

また$HOME/.profileのDOKER_CERT_PATHの行を
/mnt/cなのを/mntを除いて/cとする

ファイルの書き換えが終わったら
wslのウインドウを閉じて
Powershellからコマンドでwslを終了する

> wslconfig /t Ubuntu

wslからdockerを起動したときに
windowsディレクトリにアクセスできたら完了
例えば以下のコマンドをwslから実行する

$ docker run --rm -v /e/hoge:/tmp/fuga -it ubuntu /bin/bash

Dockerのubuntuの/tmp/fugaを見たときに
windowsのe:\hogeの内容が見えたら
フォルダの共有ができている


とりあえず前準備はここまで

続きます


以下に過去記事のリンク
mecobalamin.hatenablog.com
mecobalamin.hatenablog.com
mecobalamin.hatenablog.com

ゲノムブラウザのセッティング
www.ncbi.nlm.nih.gov

はてなブログでスタイルシートを使う

~~~~~ 16 March 2023追記 ~~~~~
今はもう少しシンプルに書いてて次のように書いてる
hogehogeで外枠をつくり
その内部にfuga1とfuga2で2つコンテンツを配置する
それらの幅はそれぞれ30%と70%

.hogehoge{
    display: flex;
    border: solid 3px #dcdcdc;
    background-color:#F9F9F9;

    text-align: center;
    align-items: center;

    margin: 0px;
    padding: 5px;
    width: 100%;
    height:260px
}
  
.fuga1{
    display: block;
    width: 30%;

}
  
.fuga2{
    display: block;
    font-size:14px;
    width: 70%;
}

~~~~~ 追記ここまで ~~~~~

[ダッシュボード]などの左のツールバーから
[デザイン] -> [カスタマイズ] -> [デザインCSS]
スタイルシートにアクセスできる

divタグなどのstyleを指定するには
スタイルシートに以下の記述を加える

.hogehoge{
  display: table;
  border: solid thin #dcdcdc;
  background-color:#F9F9F9;
  text-align: center;
  margin: 0px;
  padding: 0px;
  width: 100%;
  height:240px
}

.hugahuga{
  display: table-cell;
  vertical-align: middle;
  float: left;
  width: 45%;
  margin-top: -30px;
  margin-bottom: 0px;
  margin-left: 5%;
  margin-right: 0%;
  padding: 0px;
  height: 220px
}

トップマージンをマイナスにしているのは
はてな記法のときに改行が入るのでその調整
markdownだといらないかも

設定したパラメータは
以下のようにして使用する

<div class="hogehoge">
  <div class="hugahuga">
    <a href="https://www.google.com/?hl=ja">
    google
    </a>
  </div>
  <div class="hugahuga">
    <a href="https://www.yahoo.co.jp/">
    yahoo!
    </a>
  </div>
  <div style="clear:both;">&nbsp;</div>
</div>

表示結果は以下の通り



直接関係ないけど
Amazonアソシエイトのパラメータを
まとめてあるサイトって見つけられない
ここぐらいか
Amazonアソシエイト 解説

Windows Terminalのインストールと設定


つい最近、WSLをPowerShellから起動できることを知った
以下のようにするだけ

$ wsl

今までWSLをインストールしたときに標準でつかえる
ターミナルエミュレータを使っていたが
PowerShellでWSLを使えるなら
これらを一つのウィンドウで使えるようにできないだろうか

そう思って探してみたら
Windows Terminalを見つけた

Windows Terminalとは

マイクロソフトによって開発中のWindows 10向けの端末エミュレータである[2]。MITライセンスの下で公開されており、コマンドプロンプトPowerShell、WSL及びSSHに対応している[3]。

Microsoft Storeから入手可能
Microsoft Apps

タブも使えて便利


標準ではPowerShellが起動する
WSL(Ubuntu)はウィンドウ上部の"v"をクリックすると
いくつかメニューが表示されるので
Ubuntuを選択して起動する
起動時はWSLのホームではなくPowerShellのホームディレクトリになっている

やや使いづらい
そこでカスタマイズした設定を記録する


以下のサイトを参考にした
Windows Terminalをカスタマイズしよう!(v1.0.1401.0版) - Qiita
Windows Terminal Tips - Qiita


手順として

  1. 拡張子.jsonAtomに関連付ける
  2. settings.jsonAtomで編集

編集内容は

  • デフォルトをWSLにする
  • 起動時のウインドウの位置を左上部に合わせる
  • ウインドウサイズを120文字、50行にする
  • フォントをMyrica Mに、サイズを12 ptに変更する
  • WSL起動時のディレクトリをホームにする


設定はWindow Terminalウインドウの
"v"をクリックして"設定”から行う

設定ファイルはsettings.jsonというjson形式のファイルで
”設定”をクリックするとこのファイルが開く
ファイルは拡張子.jsonを関連付けたアプリを使って
開くので今回はAtomに関連付けておく
Atomにしたのは使い慣れているから

関連付けは
"設定” -> ”アプリ” -> "規定のアプリ" -> "ファイルの種類ごとに規定のアプリを選ぶ"
から行う

設定ファイルを開いて以下のように編集する

WSLをデフォルトで起動する
guidで指定する

    "defaultProfile": "{2c4de342-38b7-51cf-b940-2309a097f518}",

ウインドウの位置合わせ

    "initialPosition": "0,0",

一行あたりの文字数と行数

    "initialCols": 120,
    "initialRows": 58,

フォントの種類とサイズの指定

    "fontFace": "Myrica M",
    "fontSize": 12

起動時のディレクトリを指定する
dオプションはディストリビューションを指定している

    "commandline" : "wsl.exe ~ -d Ubuntu",

ディストリビューションPowerShellから

$ wsl -l

で確認できる

これらをsettings.jsonに追加する
書き込む場所はdefaults.jsonを参考にすると良い
”設定”をaltキーを押しながらクリックすると
settings.jsonではなくdefaults.jsonが起動する

defaults.jsonパーミッションの関係で
編集できなかった

書き換えたsettings.json全文は以下の通り

// This file was initially generated by Windows Terminal 1.1.2233.0
// It should still be usable in newer versions, but newer versions might have additional
// settings, help text, or changes that you will not see unless you clear this file
// and let us generate a new one for you.

// To view the default settings, hold "alt" while clicking on the "Settings" button.
// For documentation on these settings, see: https://aka.ms/terminal-documentation
{
    "$schema": "https://aka.ms/terminal-profiles-schema",

    "defaultProfile": "{2c4de342-38b7-51cf-b940-2309a097f518}",
    "initialPosition": "0,0",
    "initialCols": 120,
    "initialRows": 58,

    // You can add more global application settings here.
    // To learn more about global settings, visit https://aka.ms/terminal-global-settings

    // If enabled, selections are automatically copied to your clipboard.
    "copyOnSelect": false,

    // If enabled, formatted data is also copied to your clipboard
    "copyFormatting": false,

    // A profile specifies a command to execute paired with information about how it should look and feel.
    // Each one of them will appear in the 'New Tab' dropdown,
    //   and can be invoked from the commandline with `wt.exe -p xxx`
    // To learn more about profiles, visit https://aka.ms/terminal-profile-settings
    "profiles":
    {
        "defaults":
        {
            // Put settings here that you want to apply to all profiles.
            "fontFace": "Myrica M",
            "fontSize": 12
        },
        "list":
        [
            {
                // Make changes here to the powershell.exe profile.
                "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
                "name": "Windows PowerShell",
                "commandline": "powershell.exe",
                "hidden": false
            },
            {
                // Make changes here to the cmd.exe profile.
                "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
                "name": "コマンド プロンプト",
                "commandline": "cmd.exe",
                "hidden": false
            },
            {
                "guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
                "hidden": false,
                "name": "Ubuntu",
                "commandline" : "wsl.exe ~ -d Ubuntu",
                "source": "Windows.Terminal.Wsl"
            },
            {
                "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}",
                "hidden": false,
                "name": "Azure Cloud Shell",
                "source": "Windows.Terminal.Azure"
            }
        ]
    },

    // Add custom color schemes to this array.
    // To learn more about color schemes, visit https://aka.ms/terminal-color-schemes
    "schemes": [],

    // Add custom keybindings to this array.
    // To unbind a key combination from your defaults.json, set the command to "unbound".
    // To learn more about keybindings, visit https://aka.ms/terminal-keybindings
    "keybindings":
    [
        // Copy and paste are bound to Ctrl+Shift+C and Ctrl+Shift+V in your defaults.json.
        // These two lines additionally bind them to Ctrl+C and Ctrl+V.
        // To learn more about selection, visit https://aka.ms/terminal-selection
        { "command": {"action": "copy", "singleLine": false }, "keys": "ctrl+c" },
        { "command": "paste", "keys": "ctrl+v" },

        // Press Ctrl+Shift+F to open the search box
        { "command": "find", "keys": "ctrl+shift+f" },

        // Press Alt+Shift+D to open a new pane.
        // - "split": "auto" makes this pane open in the direction that provides the most surface area.
        // - "splitMode": "duplicate" makes the new pane use the focused pane's profile.
        // To learn more about panes, visit https://aka.ms/terminal-panes
        { "command": { "action": "splitPane", "split": "auto", "splitMode": "duplicate" }, "keys": "alt+shift+d" }
    ]
}

pythonでirisのデータセットを使う

pythonでもirisのデータセットを使える
mecobalamin.hatenablog.com

こちらのサイトで紹介されている
Sklearnを使ってみる1 - ぴろの狂人日記
iris以外のデータセットも使える
scikit-learnのサンプルデータセットの一覧と使い方 | note.nkmk.me


今回はirisのデータセットの内容を確認し
統計処理を行ってグラフを作成する


まずデータセットを確認してみた
irisのデータセットはscikit-learnに含まれている
そこでscikit-learnのdatasetsをインポートする

from sklearn import datasets

irisのデータセットを読み込む

iris = datasets.load_iris()

データセットの型はsklearn.utils.Bunchで
辞書の書式でデータが記録されている

print(type(iris))
print(iris.keys())
print(iris.values())

結果がこちら

<class 'sklearn.utils.Bunch'>
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])
dict_values([array([[5.1, 3.5, 1.4, 0.2],
       [4.9, 3. , 1.4, 0.2],
~~~省略~~~
'petal length (cm)', 'petal width (cm)'], 
'D:\\Python\\Python37-32\\lib\\site-packages\\sklearn\\datasets\\data\\iris.csv'])

データセットについての説明もある

print(iris.DESCR)

データの統計値もある

    ============== ==== ==== ======= ===== ====================
                    Min  Max   Mean    SD   Class Correlation
    ============== ==== ==== ======= ===== ====================
    sepal length:   4.3  7.9   5.84   0.83    0.7826
    sepal width:    2.0  4.4   3.05   0.43   -0.4194
    petal length:   1.0  6.9   3.76   1.76    0.9490  (high!)
    petal width:    0.1  2.5   1.20   0.76    0.9565  (high!)
    ============== ==== ==== ======= ===== ====================


irisのデータセットをpandasのデータフレームに変換する
その時dataのカラム名をfeature_namesを当てる
またtargetをirisの種名に変えてdataのカラムに追加する

df = pd.DataFrame(iris.data, columns = iris.feature_names)
df['target'] = iris.target_names[iris.target]
print(df.head())

出力結果はこんな感じ
(見辛いのではてな記法で表組みした)

sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) target
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa

~~~以下略~~~

統計値を確認

print(df.mean())

当然だけどiris.DESCRで表示される結果と同じになる
繰り上がりがちょっと変な気がする

sepal length (cm)    5.843333
sepal width (cm)     3.057333
petal length (cm)    3.758000
petal width (cm)     1.199333
dtype: float64

統計値をまとめて出すこともできる

print({}.format(df.describe().T))

比較しやすいように行と列を入れ替えてある

                   count      mean       std  min  25%   50%  75%  max
sepal length (cm)  150.0  5.843333  0.828066  4.3  5.1  5.80  6.4  7.9
sepal width (cm)   150.0  3.057333  0.435866  2.0  2.8  3.00  3.3  4.4
petal length (cm)  150.0  3.758000  1.765298  1.0  1.6  4.35  5.1  6.9
petal width (cm)   150.0  1.199333  0.762238  0.1  0.3  1.30  1.8  2.5

pandasのgoupbyで種ごとの統計値を計算する

df_grouped = df.groupby(['target'])
print(df_grouped.mean())
            sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
target                                                               
setosa                  5.006             3.428              1.462             0.246
versicolor              5.936             2.770              4.260             1.326
virginica               6.588             2.974              5.552             2.026


結果を棒グラフとヒートマップにして
画像として保存する

current_dpi = mpl.rcParams['figure.dpi']
print(current_dpi)

path = os.getcwd()
path = os.chdir(os.path.dirname(os.path.abspath(__file__)))
path = os.getcwd()

plt.figure()
df_grouped.mean().T.plot(kind = 'bar', yerr = df_grouped.std().T, rot = 0)
plt.savefig(path + '\\' + 'bar_graph_mean.png', dpi = current_dpi * 1.5)
plt.close()

plt.figure()
plt.figure(figsize=(8, 6))
sns.heatmap(df_grouped.mean().T, square = True, cmap = 'plasma')
plt.savefig(path + '\\' + 'heatmap_mean.png', dpi = current_dpi * 1.5)
plt.close()

グラフは以下の通り

ヒートマップのカラーマップは以下のサイトを参考にした
https://matplotlib.org/tutorials/colors/colormaps.html#grayscale-conversion


実際のコードはこんな感じ

import os

from pandas import Series, DataFrame
import pandas as pd

from sklearn import datasets

import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns

pd.set_option('display.max_columns', 10)

iris = datasets.load_iris()
print(type(iris))
print(iris.keys())
print(iris.DESCR)

df = pd.DataFrame(iris.data, columns = iris.feature_names)
df['target'] = iris.target_names[iris.target]

print(df.head())
print(df.columns)

df_grouped = df.groupby(['target'])
df_mean = df_grouped.mean()
print(df_mean)

current_dpi = mpl.rcParams['figure.dpi']
print(current_dpi)

path = os.getcwd()
path = os.chdir(os.path.dirname(os.path.abspath(__file__)))
path = os.getcwd()

plt.figure()
df_grouped.mean().T.plot(kind = 'bar', yerr = df_grouped.std().T, rot = 0)
plt.savefig(path + '\\' + 'bar_graph_mean.png', dpi = current_dpi * 1.5)
plt.close()

plt.figure(figsize=(8, 6))
sns.heatmap(df_grouped.mean().T, square = True, cmap = 'plasma')
plt.savefig(path + '\\' + 'heatmap_mean.png', dpi = current_dpi * 1.5)
plt.close()