web-dev-qa-db-ja.com

Pythonヒートマップ:カラーマップを変更して非対称にする

このデータのヒートマップを作成したいと思います。

curation1       curation2       overlap
1      2      0
1      3      1098
1      4      11
1      5      137
1      6      105
1      7      338
2      3      351
2      4      0
2      5      1
2      6      0
2      7      0
3      4      132
3      5      215
3      6      91
3      7      191
4      5      6
4      6      10
4      7      19
5      6      37
5      7      95
6      7     146

このコードでヒートマップを作成しました:

import sys
import pandas as pd
import matplotlib
matplotlib.use('Agg')
import matplotlib.ticker as ticker
import matplotlib.cm as cm
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
from matplotlib import colors

data_raw = pd.read_csv(sys.argv[1],sep = '\t')
data_raw["curation1"] = pd.Categorical(data_raw["curation1"], data_raw.curation1.unique())
data_raw["curation2"] = pd.Categorical(data_raw["curation2"], data_raw.curation2.unique())
data_matrix = data_raw.pivot("curation1", "curation2", "overlap")

fig = plt.figure()
fig, ax = plt.subplots(1,1, figsize=(12,12))
heatplot = ax.imshow(data_matrix,cmap = 'BuPu')
#ax.set_xticklabels(data_matrix.columns)
#ax.set_yticklabels(data_matrix.index)
tick_spacing = 1
#ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
#ax.yaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
ax.set_title("Overlap")
fig.savefig('output.pdf')

出力は次のようになります: this

私は3つの質問があります:

  1. ほとんどのデータが非常に薄い色であるという意味で、配色が少し「オフ」であり、「0」を示すランダムな紫色のボックスがあることがわかります。理想的には、このヒートマップをさまざまな色合いの緑にし、最も暗い緑を最大の数値にし、最も明るい(ただしはっきりと見える)緑を最小の数値にします。 'cmap'引数を試してみました。例: pythonチュートリアル ここ ;で説明されているように 'winter'に変更します;しかし、私は何か間違ったことをしています。誰かがこれを具体的にどこで変更できるか教えてもらえますか?

  2. カラーバー:カラーバーを追加したいのですが、最初に質問1を整理する必要があると思います。

  3. 非対称:ご覧のとおり、このプロットは非対称です。ヒートマップの半分をプロットすることは可能ですか(たとえば、不要な線を取り除き、代わりに軸ラベルをプロットの右側に移動する可能性がありますか?;そうでない場合は、再ジグできるため、これは大したことではありませんPowerPointでそれ)。

6
Slowat_Kela

これにより、最初の2つの問題が解決されます-

fig = plt.figure()
fig, ax = plt.subplots(1,1, figsize=(12,12))
heatplot = ax.imshow(data_matrix,cmap = 'Greens')

cbar = fig.colorbar(heatplot, ticks=[data_raw.overlap.min(), data_raw.overlap.max()])
tick_spacing = 1
ax.set_title("Overlap")
1
Aritesh

適切なカラーマップを選択することから始めます(見てください ここ )、あなたの目的のためにが良いかもしれません。名前に '_ r'を追加すると、カラーマップを元に戻すことができることに注意してください。

あなたの値はかなり異なるので、私は対数カラースケールを使用します。これを行うには、color.LogNormを含めます(import matplotlib.colors as colorsから)

3番目の質問に対処するために、軸を右上に移動し、下と左の線を削除します。

# Plot heatmap
f, ax = plt.subplots()
lognorm = colors.LogNorm(vmin = data.min(), vmax = data.max())
heatplot  = ax.imshow(data, vmin = 1, norm = lognorm, cmap = 'Greens')

# Move axis to top-right and remove bottom and left line
ax.xaxis.set_ticks_position('top')
ax.yaxis.set_ticks_position('right')
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)

# Use instead of ax.set_title to move title a bit higher up
f.suptitle('Overlap') 

# Add colorbar
cb = f.colorbar(heatplot)

f.show()

enter image description here

0
NLindros

代わりにseaborn heatmap関数を使用します。カラーマップGreensは、希望する配色に関してトリックを実行する必要があります。必要に応じて、 matplotlib docs で他のオプションを確認できます。

ただハイライトと ctrlc yout質問のデータセットを使用して、以下のスニペットを実行します。

# Imports
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

data_raw = pd.read_clipboard(sep='\\s+')
data_matrix = data_raw.pivot("curation1", "curation2", "overlap")
data_matrix = data_matrix.fillna(0)

# A heatmap function that builds on the seaborn heatmap function
def HeatMap_function(df, title, transpose = True, colors = 'Greens', dropDuplicates = True):

    if transpose:
        df = df.T

    if dropDuplicates:    
        mask = np.zeros_like(df, dtype=np.bool)
        mask = np.invert(mask)
        mask[np.triu_indices_from(mask)] = False

    # Set background color / chart style
    sns.set_style(style = 'white')

    # Set up  matplotlib figure
    f, ax = plt.subplots(figsize=(11, 9))
    ax.set_title(title)

    # Add diverging colormap from red to blue
    # cmap = sns.diverging_palette(250, 10, as_cmap=True)
    cmap=plt.get_cmap(colors)

    # Draw correlation plot with or without duplicates
    if dropDuplicates:
        sns.heatmap(df, mask=mask, cmap=cmap, 
                square=True,
                linewidth=.5, cbar_kws={"shrink": .5}, ax=ax)
    else:
        sns.heatmap(df, cmap=cmap, 
                square=True,
                linewidth=.5, cbar_kws={"shrink": .5}, ax=ax)

    ax.xaxis.set_ticks_position('top')
    ax.yaxis.set_ticks_position('right')

# A testrun
HeatMap_function(df = data_matrix, title = 'Overlap', transpose = False,
                 colors = 'Greens', dropDuplicates = True)

そして、あなたはこれを得るでしょう:

enter image description here

transposecolorsdropDuplicatesのさまざまな組み合わせを使用して、プロットのレイアウトを変更することもできます。

0
vestland