ทำแผนที่ความร้อนจาก DataFrame แพนด้า


113

ฉันมีดาต้าเฟรมที่สร้างจากแพ็คเกจ Pandas ของ Python ฉันจะสร้างแผนที่ความร้อนโดยใช้ DataFrame จากแพ็คเกจแพนด้าได้อย่างไร

import numpy as np 
from pandas import *

Index= ['aaa','bbb','ccc','ddd','eee']
Cols = ['A', 'B', 'C','D']
df = DataFrame(abs(np.random.randn(5, 4)), index= Index, columns=Cols)

>>> df
          A         B         C         D
aaa  2.431645  1.248688  0.267648  0.613826
bbb  0.809296  1.671020  1.564420  0.347662
ccc  1.501939  1.126518  0.702019  1.596048
ddd  0.137160  0.147368  1.504663  0.202822
eee  0.134540  3.708104  0.309097  1.641090
>>> 

คุณได้ลองทำอะไรบ้างในแง่ของการสร้างแผนที่ความร้อนหรือการวิจัย? หากต้องการทราบข้อมูลเพิ่มเติมขอแนะนำให้แปลงข้อมูลและใช้วิธีนี้
ผู้เรียน

@joelostblom นี่ไม่ใช่คำตอบเป็นความคิดเห็น แต่ปัญหาคือฉันไม่มีชื่อเสียงมากพอที่จะแสดงความคิดเห็นได้ ฉันรู้สึกงุนงงเล็กน้อยเนื่องจากค่าผลลัพธ์ของเมทริกซ์และอาร์เรย์ดั้งเดิมนั้นแตกต่างกันโดยสิ้นเชิง ฉันต้องการพิมพ์ค่าที่แท้จริงในแผนที่ความร้อนไม่แตกต่างกัน ใครช่วยอธิบายฉันได้ไหมว่าทำไมสิ่งนี้ถึงเกิดขึ้น ตัวอย่างเช่น * ข้อมูลที่จัดทำดัชนีเดิม: aaa / A = 2.431645 * ค่าที่พิมพ์ในแผนที่ความร้อน: aaa / A = 1.06192
Monitotier

@Monitotier โปรดถามคำถามใหม่และใส่ตัวอย่างโค้ดที่สมบูรณ์ของสิ่งที่คุณได้ลอง นี่เป็นวิธีที่ดีที่สุดในการหาคนมาช่วยคิดว่ามีอะไรผิดปกติ! คุณสามารถเชื่อมโยงไปยังคำถามนี้ได้หากคุณคิดว่าเกี่ยวข้อง
joelostblom

คำตอบ:


82

คุณต้องการmatplotlib.pcolor:

import numpy as np 
from pandas import DataFrame
import matplotlib.pyplot as plt

index = ['aaa', 'bbb', 'ccc', 'ddd', 'eee']
columns = ['A', 'B', 'C', 'D']
df = DataFrame(abs(np.random.randn(5, 4)), index=index, columns=columns)

plt.pcolor(df)
plt.yticks(np.arange(0.5, len(df.index), 1), df.index)
plt.xticks(np.arange(0.5, len(df.columns), 1), df.columns)
plt.show()

สิ่งนี้ให้:

ตัวอย่างผลลัพธ์


5
มีบางสนทนาที่น่าสนใจคือที่นี่เกี่ยวกับpcolor imshow
LondonRob

1
... และยังpcolormeshเหมาะสำหรับกราฟิกประเภทนี้
Eric O Lebigot

180

สำหรับคนที่กำลังมองหาวันนี้ผมขอแนะนำ Seaborn heatmap()เป็นเอกสารที่นี่

ตัวอย่างข้างต้นจะทำได้ดังนี้:

import numpy as np 
from pandas import DataFrame
import seaborn as sns
%matplotlib inline

Index= ['aaa', 'bbb', 'ccc', 'ddd', 'eee']
Cols = ['A', 'B', 'C', 'D']
df = DataFrame(abs(np.random.randn(5, 4)), index=Index, columns=Cols)

sns.heatmap(df, annot=True)

ในกรณีที่%matplotlibเป็นฟังก์ชั่นมายากล IPython สำหรับผู้ที่ไม่คุ้นเคย


ทำไมไม่ใช้แพนด้าล่ะ?
tommy.carstensen

9
Seaborn และ Pandas ทำงานร่วมกันได้เป็นอย่างดีดังนั้นคุณยังคงใช้ Pandas เพื่อทำให้ข้อมูลของคุณมีรูปร่างที่เหมาะสม Seaborn เชี่ยวชาญด้านแผนภูมิแบบคงที่และทำให้การสร้างแผนที่ความร้อนจาก Pandas DataFrame เป็นเรื่องง่าย
Brideau

ดูเหมือนว่าลิงก์นี้จะตายแล้ว ช่วยอัพเดทหน่อยได้ไหม!? นอกจากนี้ฉันจะรันโค้ดด้านบนด้วยวิธีimport matplotlib.pyplot as pltใด
Cleb

เฮ้ @Cleb ฉันต้องอัปเดตไปยังหน้าที่เก็บถาวรเพราะดูเหมือนว่ามันจะไม่ขึ้นทุกที่ ดูเอกสารของพวกเขาสำหรับการใช้งานกับ pyplot: stanford.edu/~mwaskom/software/seaborn-dev/tutorial/…
Brideau

ใช้import matplotlib.pyplot as pltแทน%matplotlib inlineและจบด้วยplt.show()เพื่อดูพล็อตจริง
tsveti_iko

84

หากคุณไม่ต้องการพล็อตต่อคำพูดและคุณเพียงแค่สนใจที่จะเพิ่มสีเพื่อแสดงค่าในรูปแบบตารางคุณสามารถใช้style.background_gradient()วิธีการของกรอบข้อมูลแพนด้า วิธีนี้ทำให้ตาราง HTML เป็นสีที่แสดงเมื่อดูเฟรมข้อมูลแพนด้าเช่นสมุดบันทึก JupyterLab และผลลัพธ์จะคล้ายกับการใช้ "การจัดรูปแบบตามเงื่อนไข" ในซอฟต์แวร์สเปรดชีต:

import numpy as np 
import pandas as pd


index= ['aaa', 'bbb', 'ccc', 'ddd', 'eee']
cols = ['A', 'B', 'C', 'D']
df = pd.DataFrame(abs(np.random.randn(5, 4)), index=index, columns=cols)
df.style.background_gradient(cmap='Blues')

ใส่คำอธิบายภาพที่นี่

สำหรับการใช้งานรายละเอียดโปรดดูคำตอบที่ซับซ้อนมากขึ้นผมมีให้บริการในหัวข้อเดียวกันก่อนหน้านี้และส่วนจัดแต่งทรงผมของเอกสารหมีแพนด้า


4
ให้ตายเถอะคำตอบนี้คือคำตอบที่ฉันกำลังมองหา IMO ควรสูงกว่า (+1)
ponadto

7
คำตอบนี้ไม่ใช่วิธีแก้ปัญหาที่ถูกต้องสำหรับคำถามที่โพสต์ การไล่ระดับสีพื้นหลังของหมีแพนด้าจะคำนึงถึงแต่ละแถวหรือแต่ละคอลัมน์แยกกันในขณะที่การระบายสี pcolor หรือ pcolormesh ของ matplotlib จะคำนึงถึงเมทริกซ์ทั้งหมด ยกตัวอย่างเช่นรหัสต่อไปนี้ pd.DataFrame([[1, 1], [0, 3]]).style.background_gradient(cmap='summer') ส่งผลให้ตารางมีสองรหัสแต่ละรายการมีสีที่ต่างกัน
Toni Penya-Alba

4
@ ToniPenya-Alba คำถามคือเกี่ยวกับวิธีสร้างแผนที่ความร้อนจากดาต้าเฟรมของแพนด้าไม่ใช่วิธีการจำลองพฤติกรรมของ pcolor หรือ pcolormesh หากคุณสนใจอย่างหลังเพื่อจุดประสงค์ของคุณเองคุณสามารถใช้axis=None(ตั้งแต่แพนด้า 0.24.0)
joelostblom

2
@joelostblom ฉันไม่ได้หมายถึงความคิดเห็นของฉันในลักษณะ "ทำซ้ำเครื่องมือหนึ่งหรือพฤติกรรมอื่น" แต่โดยทั่วไปแล้วเราต้องการองค์ประกอบทั้งหมดในเมทริกซ์ตามมาตราส่วนเดียวกันแทนที่จะมีมาตราส่วนที่แตกต่างกันสำหรับแต่ละแถว / คอลัมน์ " ตามที่คุณชี้ให้เห็นaxis=Noneว่าบรรลุสิ่งนั้นและในความคิดของฉันมันควรจะเป็นส่วนหนึ่งของคำตอบของคุณ (โดยเฉพาะอย่างยิ่งเนื่องจากดูเหมือนจะไม่ได้รับการบันทึกเป็นเอกสาร0 )
Toni Penya-Alba

2
@ ToniPenya-Alba ฉันได้axis=Noneเป็นส่วนหนึ่งของคำตอบโดยละเอียดที่ฉันลิงก์ไปด้านบนพร้อมกับตัวเลือกอื่น ๆ อีกเล็กน้อยเพราะฉันเห็นด้วยกับคุณว่าตัวเลือกเหล่านี้บางตัวช่วยให้เกิดพฤติกรรมที่ต้องการโดยทั่วไปได้ ฉันยังพบการขาดเอกสารเมื่อวานนี้และเปิดการประชาสัมพันธ์
joelostblom

17

ประโยชน์sns.heatmapAPI เป็นที่นี่ ตรวจสอบพารามิเตอร์มีจำนวนมาก ตัวอย่าง:

import seaborn as sns
%matplotlib inline

idx= ['aaa','bbb','ccc','ddd','eee']
cols = list('ABCD')
df = DataFrame(abs(np.random.randn(5,4)), index=idx, columns=cols)

# _r reverses the normal order of the color map 'RdYlGn'
sns.heatmap(df, cmap='RdYlGn_r', linewidths=0.5, annot=True)

ใส่คำอธิบายภาพที่นี่


4

หากคุณต้องการแผนที่ความร้อนแบบโต้ตอบจาก Pandas DataFrame และคุณกำลังเรียกใช้สมุดบันทึก Jupyter คุณสามารถลองใช้ Widget Clustergrammer-Widgetแบบโต้ตอบดูสมุดบันทึกแบบโต้ตอบบน NBViewer ที่นี่เอกสารประกอบที่นี่

ใส่คำอธิบายภาพที่นี่

และสำหรับชุดข้อมูลขนาดใหญ่คุณสามารถลองใช้วิดเจ็ตClustergrammer2 WebGL ที่กำลังพัฒนา(ตัวอย่างสมุดบันทึกที่นี่ )


1
ว้าววววววววว!
Sos

3

โปรดทราบว่าผู้เขียนต้องการseabornเท่านั้น seaborn.heatmapที่จะทำงานร่วมกับ dataframes เด็ดขาด ไม่ใช่เรื่องทั่วไป

หากดัชนีและคอลัมน์ของคุณเป็นตัวเลขและ / หรือค่าวันที่และเวลารหัสนี้จะตอบสนองคุณได้ดี

ฟังก์ชันการทำแผนที่ความร้อน Matplotlib pcolormeshต้องใช้ถังขยะแทนดัชนีดังนั้นจึงมีโค้ดแฟนซีบางอย่างในการสร้างถังขยะจากดัชนีดาต้าเฟรมของคุณ (แม้ว่าดัชนีของคุณจะไม่เว้นระยะเท่า ๆ กันก็ตาม!)

ส่วนที่เหลือเป็นเพียงและnp.meshgridplt.pcolormesh

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def conv_index_to_bins(index):
    """Calculate bins to contain the index values.
    The start and end bin boundaries are linearly extrapolated from 
    the two first and last values. The middle bin boundaries are 
    midpoints.

    Example 1: [0, 1] -> [-0.5, 0.5, 1.5]
    Example 2: [0, 1, 4] -> [-0.5, 0.5, 2.5, 5.5]
    Example 3: [4, 1, 0] -> [5.5, 2.5, 0.5, -0.5]"""
    assert index.is_monotonic_increasing or index.is_monotonic_decreasing

    # the beginning and end values are guessed from first and last two
    start = index[0] - (index[1]-index[0])/2
    end = index[-1] + (index[-1]-index[-2])/2

    # the middle values are the midpoints
    middle = pd.DataFrame({'m1': index[:-1], 'p1': index[1:]})
    middle = middle['m1'] + (middle['p1']-middle['m1'])/2

    if isinstance(index, pd.DatetimeIndex):
        idx = pd.DatetimeIndex(middle).union([start,end])
    elif isinstance(index, (pd.Float64Index,pd.RangeIndex,pd.Int64Index)):
        idx = pd.Float64Index(middle).union([start,end])
    else:
        print('Warning: guessing what to do with index type %s' % 
              type(index))
        idx = pd.Float64Index(middle).union([start,end])

    return idx.sort_values(ascending=index.is_monotonic_increasing)

def calc_df_mesh(df):
    """Calculate the two-dimensional bins to hold the index and 
    column values."""
    return np.meshgrid(conv_index_to_bins(df.index),
                       conv_index_to_bins(df.columns))

def heatmap(df):
    """Plot a heatmap of the dataframe values using the index and 
    columns"""
    X,Y = calc_df_mesh(df)
    c = plt.pcolormesh(X, Y, df.values.T)
    plt.colorbar(c)

เรียกว่าใช้และดูได้โดยใช้heatmap(df)plt.show()

ใส่คำอธิบายภาพที่นี่


คุณสามารถแสดงข้อมูลจำลองได้หรือไม่? ฉันได้รับข้อผิดพลาดในการยืนยันกับดัชนี
jonboy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.