পান্ডাস ডেটা ফ্রেম থেকে হিটম্যাপ তৈরি করা


112

পাইথনের পান্ডাস প্যাকেজ থেকে আমার ডেটাফ্রেম তৈরি হয়েছে। আমি কীভাবে পান্ডাস প্যাকেজ থেকে ডেটা ফ্রেম ব্যবহার করে হিটম্যাপ তৈরি করতে পারি।

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
>>> 

হিটম্যাপ বা গবেষণা তৈরির ক্ষেত্রে আপনি কী চেষ্টা করেছেন? আরও কিছু না জেনে, আমি আপনার ডেটা রূপান্তর করতে এবং এই পদ্ধতিটি ব্যবহার
শিক্ষার্থী

@ জোয়েলস্টব্লম এটি একটি উত্তর নয়, একটি মন্তব্য, তবে সমস্যাটি হ'ল মন্তব্য করতে সক্ষম হওয়ার মতো যথেষ্ট খ্যাতি আমার নেই। আমি কিছুটা বিস্মিত হই কারণ ম্যাট্রিক্স এবং মূল অ্যারের আউটপুট মান সম্পূর্ণ আলাদা। আমি তাপ-মানচিত্রে আসল মানগুলি মুদ্রণ করতে চাই, কিছু আলাদা নয়। কেউ আমাকে ব্যাখ্যা করতে পারে কেন এমন হচ্ছে। উদাহরণস্বরূপ: * আসল ইনডেক্সড ডেটা: এএএ / এ = 2.431645 * তাপ-মানচিত্রে মুদ্রিত মান: এএএ / এ = 1.06192
মনিটোটিয়র

@ মনিটোটিয়ার দয়া করে একটি নতুন প্রশ্ন জিজ্ঞাসা করুন এবং আপনি যা চেষ্টা করেছেন তার একটি সম্পূর্ণ কোড উদাহরণ অন্তর্ভুক্ত করুন। কোনটি ভুল তা বুঝতে সাহায্য করার জন্য এটিই সর্বোত্তম উপায়! আপনি যদি এটিকে প্রাসঙ্গিক মনে করেন তবে আপনি এই প্রশ্নের সাথে লিঙ্ক করতে পারেন।
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
বনাম সম্পর্কে এখানে কিছু আকর্ষণীয় আলোচনা রয়েছে । pcolorimshow
লন্ডনরব

1
… এবং এছাড়াও pcolormesh, যা এই ধরণের গ্রাফিক্সের জন্য অনুকূলিত।
এরিক হে লেবিগোট

180

লোকেরা আজ এটি দেখার জন্য, আমি এখানে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অপরিচিত তাদের আইপিথন যাদু ফাংশন।


আপনি পান্ডা ব্যবহার করবেন না কেন?
tommy.carstensen

9
সামুদ্রিক এবং পান্ডারা একসাথে সুন্দরভাবে কাজ করে, তাই আপনি নিজের ডেটা সঠিক আকারে আনতে পান্ডা ব্যবহার করবেন। সামুদ্রিক যদিও স্ট্যাটিক চার্টগুলিতে বিশেষ পারদর্শী, এবং একটি পান্ডাস ডেটা ফ্রেম ডেড সহজ থেকে হিটম্যাপ তৈরি করে।
ব্রাইডউ

মনে হচ্ছে এই লিঙ্কটি মারা গেছে; আপনি এটি আপডেট করতে পারে !? তদতিরিক্ত, আমি উপরের কোডটি কীভাবে চালাব import matplotlib.pyplot as plt?
ক্লেব

আরে ক্লেব, আমার সংরক্ষণাগার পৃষ্ঠায় এটি আপডেট করতে হয়েছিল কারণ এটি কোথাও এটির মতো দেখাচ্ছে না। : Pyplot সঙ্গে এটি ব্যবহার করার জন্য তাদের ডক্স কটাক্ষপাত stanford.edu/~mwaskom/software/seaborn-dev/tutorial/...
Brideau

import matplotlib.pyplot as pltপরিবর্তে ব্যবহার করুন %matplotlib inlineএবং plt.show()প্লটটি দেখতে আসলে শেষ করুন ।
tsveti_iko

83

যদি আপনার প্রতি প্রতি চক্রান্তের প্রয়োজন না হয় এবং আপনি কেবল কোনও টেবিল বিন্যাসে মানগুলি উপস্থাপন করতে রঙ যুক্ত করতে আগ্রহী হন তবে আপনি style.background_gradient()পান্ডাস ডেটা ফ্রেমের পদ্ধতিটি ব্যবহার করতে পারেন । এই পদ্ধতিটি এইচডিএমএল টেবিলকে রঙিন করে যা পান্ডাস ডেটা ফ্রেমগুলি দেখানোর সময় প্রদর্শিত হয় যেমন জুপিটারল্যাব নোটবুক এবং ফলাফলটি স্প্রেডশিট সফ্টওয়্যারটিতে "শর্তসাপেক্ষ বিন্যাস" ব্যবহারের অনুরূপ:

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
অভিশাপ, এই উত্তরটি আসলে আমিই খুঁজছিলাম। আইএমও, আরও বেশি হওয়া উচিত (+1)।
পোনাড্টো

7
এই উত্তর পোস্ট করা প্রশ্নের বৈধ সমাধান নয়। পান্ডাস ব্যাকগ্রাউন্ড গ্রেডিয়েন্ট কালারিং প্রতিটি সারিতে বা প্রতিটি কলাম পৃথকভাবে অ্যাকাউন্টে গ্রহণ করে যখন ম্যাটপ্লোটলিবের পিকলর বা পিক্লোরমেশ রঙিন পুরো ম্যাট্রিক্সকে বিবেচনা করে। উদাহরণস্বরূপ নীচের pd.DataFrame([[1, 1], [0, 3]]).style.background_gradient(cmap='summer') কোডগুলি দুটি টেবিলের সাথে একটি টেবিলে ফলাফল দেয়, সেগুলির প্রতিটি আলাদা বর্ণের।
টনি পেনিয়া-আলবা

4
@ টনিপেনিয়া-আলবা প্রশ্নটি কীভাবে প্যান্ডার ডেটাফ্রেম থেকে হিটম্যাপ তৈরি করতে হয়, কীভাবে পলার বা পিক্লোরমেশের আচরণের প্রতিরূপ তৈরি করা যায় তা নয়। আপনি যদি আপনার নিজের উদ্দেশ্যে পরবর্তীগুলিতে আগ্রহী হন তবে আপনি ব্যবহার করতে পারেন axis=None(যেহেতু পান্ডাস 0.24.0)।
joelostblom

2
@ জোয়েলোস্টব্লম আমার মন্তব্যটিকে "একটি সরঞ্জাম বা অন্য আচরণের পুনরুত্পাদন" হিসাবে বোঝাতে চাইনি তবে "ম্যাট্রিক্সের প্রতিটি উপাদান প্রতিটি সারি / কলামের জন্য আলাদা স্কেল না দিয়ে একই স্কেল অনুসরণ করে চায়" বলে মনে হয়। আপনি যেমন উল্লেখ করেছেন, তা axis=Noneঅর্জন করুন এবং আমার মতে এটি আপনার উত্তরের অংশ হওয়া উচিত (বিশেষত যেহেতু এটি 0 নথিভুক্ত বলে মনে হচ্ছে না )
টনি পেনিয়া-আলবা

2
@ টনিপেনিয়া-আলবা আমি ইতিমধ্যে axis=Noneউপরে উল্লিখিত বিস্তারিত উত্তরের একটি অংশ তৈরি করেছি, এবং কয়েকটি অন্যান্য বিকল্পের সাথে একত্রিত করেছি কারণ আমি আপনার সাথে একমত যে এই বিকল্পগুলির মধ্যে কিছু সাধারণত পছন্দসই আচরণ সক্ষম করে। আমি গতকাল ডকুমেন্টেশনের অভাবও লক্ষ্য করেছি এবং একটি পিআর খুললাম
joelostblom

17

দরকারী sns.heatmapএপিআই এখানে আছে । প্যারামিটারগুলি পরীক্ষা করে দেখুন, তাদের মধ্যে একটি ভাল সংখ্যা রয়েছে। উদাহরণ:

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

আপনি যদি পান্ডাস ডেটা ফ্রেমের কাছ থেকে ইন্টারেক্টিভ হিটম্যাপ চান এবং আপনি জুপিটার নোটবুক চালাচ্ছেন তবে আপনি ইন্টারেক্টিভ উইজেট ক্লাস্টারগ্র্যামার-উইজেটটি দেখতে পারেন, এনবিভিউয়ারে ইন্টারেক্টিভ নোটবুকটি এখানে দেখতে পারেন , এখানে ডকুমেন্টেশন

এখানে চিত্র বর্ণনা লিখুন

এবং বৃহত্তর ডেটাসেটের জন্য আপনি ইন-ডেভলপমেন্ট ক্লাস্টারগ্রামগ্রাম 2 ওয়েবজিএল উইজেট চেষ্টা করতে পারেন (উদাহরণ হিসাবে এখানে নোটবুক )


1
বাহ এটা খুব ঝরঝরে! অজগরে কিছু সুন্দর প্যাকেজ আসছে দেখে ভাল লাগল
Sos

2

দয়া করে মনে রাখবেন লেখক seabornশুধুমাত্র চান seaborn.heatmap শ্রেণীগত dataframes সঙ্গে কাজ করতে। এটি সাধারণ নয়।

যদি আপনার সূচক এবং কলামগুলি সংখ্যাসূচক এবং / অথবা তারিখের মান হয় তবে এই কোডটি আপনাকে ভালভাবে পরিবেশন করবে।

Matplotlib তাপ-ম্যাপিং ফাংশন pcolormeshপ্রয়োজন বিন পরিবর্তে সূচকের , তাই আপনার dataframe সূচকের থেকে বিল্ড বিন কিছু অভিনব কোড (এমনকি যদি আপনার সূচক সমানভাবে ব্যবধানে নয়!)।

বাকীটি সহজ np.meshgridএবং plt.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()

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.