প্লেলারের সাথে ম্যাটপ্লোটিলেব হিটম্যাপ?


100

আমি এটির মতো হিটম্যাপ তৈরি করতে চাই ( ফ্লোডিংটাতে প্রদর্শিত ): তাপ মানচিত্র

উত্স ডেটা এখানে , তবে এলোমেলো ডেটা এবং লেবেল ব্যবহার করা ঠিক হবে, অর্থাত্‍

import numpy
column_labels = list('ABCD')
row_labels = list('WXYZ')
data = numpy.random.rand(4,4)

হ্যাটম্যাপ তৈরি করা ম্যাটপ্ল্লোব-এ যথেষ্ট সহজ:

from matplotlib import pyplot as plt
heatmap = plt.pcolor(data)

এমনকি আমি একটি রঙিন মানচিত্র যুক্তিও খুঁজে পেয়েছি যা ডানদিকে দেখায়:heatmap = plt.pcolor(data, cmap=matplotlib.cm.Blues)

তবে এর বাইরে, আমি কীভাবে কলাম এবং সারিগুলির জন্য লেবেল প্রদর্শন করব এবং সঠিক দিকনির্দেশনায় ডেটা প্রদর্শিত করব (নীচের বামের পরিবর্তে উপরের বামদিকে উত্সাহ)।

ম্যানিপুলেট করার প্রচেষ্টা heatmap.axes(যেমন heatmap.axes.set_xticklabels = column_labels) সমস্ত ব্যর্থ হয়েছে। আমি এখানে কি মিস করছি?


এই হিটম্যাপ প্রশ্নের সাথে প্রচুর ওভারল্যাপ রয়েছে - এটি আপনার জন্য কিছু ভাল তথ্য হতে পারে।
জন লিয়ন

এই পোস্টের লেবেল কৌশলগুলি স্ট্যাকওভারফ্লো
tacaswell

উত্তর:


123

এটি দেরি হয়ে গেছে, তবে এখানে আমার প্রবাহিত এনডিএ হিটম্যাপটি অজগর বাস্তবায়ন।

আপডেট হয়েছে: 1/4/2014 : সবাইকে ধন্যবাদ

# -*- coding: utf-8 -*-
# <nbformat>3.0</nbformat>

# ------------------------------------------------------------------------
# Filename   : heatmap.py
# Date       : 2013-04-19
# Updated    : 2014-01-04
# Author     : @LotzJoe >> Joe Lotz
# Description: My attempt at reproducing the FlowingData graphic in Python
# Source     : http://flowingdata.com/2010/01/21/how-to-make-a-heatmap-a-quick-and-easy-solution/
#
# Other Links:
#     http://stackoverflow.com/questions/14391959/heatmap-in-matplotlib-with-pcolor
#
# ------------------------------------------------------------------------

import matplotlib.pyplot as plt
import pandas as pd
from urllib2 import urlopen
import numpy as np
%pylab inline

page = urlopen("http://datasets.flowingdata.com/ppg2008.csv")
nba = pd.read_csv(page, index_col=0)

# Normalize data columns
nba_norm = (nba - nba.mean()) / (nba.max() - nba.min())

# Sort data according to Points, lowest to highest
# This was just a design choice made by Yau
# inplace=False (default) ->thanks SO user d1337
nba_sort = nba_norm.sort('PTS', ascending=True)

nba_sort['PTS'].head(10)

# Plot it out
fig, ax = plt.subplots()
heatmap = ax.pcolor(nba_sort, cmap=plt.cm.Blues, alpha=0.8)

# Format
fig = plt.gcf()
fig.set_size_inches(8, 11)

# turn off the frame
ax.set_frame_on(False)

# put the major ticks at the middle of each cell
ax.set_yticks(np.arange(nba_sort.shape[0]) + 0.5, minor=False)
ax.set_xticks(np.arange(nba_sort.shape[1]) + 0.5, minor=False)

# want a more natural, table-like display
ax.invert_yaxis()
ax.xaxis.tick_top()

# Set the labels

# label source:https://en.wikipedia.org/wiki/Basketball_statistics
labels = [
    'Games', 'Minutes', 'Points', 'Field goals made', 'Field goal attempts', 'Field goal percentage', 'Free throws made', 'Free throws attempts', 'Free throws percentage',
    'Three-pointers made', 'Three-point attempt', 'Three-point percentage', 'Offensive rebounds', 'Defensive rebounds', 'Total rebounds', 'Assists', 'Steals', 'Blocks', 'Turnover', 'Personal foul']

# note I could have used nba_sort.columns but made "labels" instead
ax.set_xticklabels(labels, minor=False)
ax.set_yticklabels(nba_sort.index, minor=False)

# rotate the
plt.xticks(rotation=90)

ax.grid(False)

# Turn off all the ticks
ax = plt.gca()

for t in ax.xaxis.get_major_ticks():
    t.tick1On = False
    t.tick2On = False
for t in ax.yaxis.get_major_ticks():
    t.tick1On = False
    t.tick2On = False

আউটপুটটি এর মতো দেখাচ্ছে: প্রবাহিত-জাতীয় এনবিএ হিটম্যাপ

এই সমস্ত কোড সহ এখানে একটি আইপথন নোটবুক রয়েছে । 'ওভারফ্লো' থেকে আমি অনেক কিছু শিখেছি আশা করি কেউ এটির কাজে লাগবে।


1
উপরের কোডটি আইপাইথন নোটবুকে চালিত হয়নি। আমি কিছুটা পরিবর্তন করেছি, এনবিএ_সোর্ট = এনবিএ_নর্ম.সর্ট ('পিটিএস', আরোহী = সত্য, স্থান = সত্য) থেকে এনবিএ_সোর্ট = এনবিএ_নর্ম.কপি () এনবিএ_সোর্ট.সোর্ট ('পিটিএস', আরোহী = সত্য, অন্তর্ভুক্ত = সত্য) সাজানোর পাশাপাশি কাজ করে ফাংশন রিটার্ন দ্বারা নয়! বিস্ময়কর দৃষ্টান্তমূলক উদাহরণের জন্য ধন্যবাদ!
ইউ শেন

1
হুমমম ... তুমি ঠিক বলেছ। নিশ্চিত যে এটি সম্পর্কে কি। আমি কোড সংশোধন করব। ধন্যবাদ!
বুদ্বুপ্পিজ

এর মতো গ্রাফিক তৈরির সবচেয়ে সহজ উপায় কী হবে তবে টেবিলে পরিসংখ্যানের মানটি প্রদর্শন করুন। অর্থাৎ আমি pcolorএটির মতো একটি তৈরি করতে চাই তবে এতেও সংখ্যাসূচক মান দেখানো হয়েছে। বা: আমি একটি ম্যাটপ্লোটিব তৈরি করতে চাই tableযা এর কোষগুলিকে রঙ করে। আমি অন্যান্য সমস্যার সমাধান দেখেছি এবং সেগুলি নান্দনিকভাবে কুৎসিত। এটি দুর্দান্ত দেখায়, যদি কেবল আমি কীভাবে সংখ্যাগুলি ওভারলে করতে জানতাম।
8one6

হ্যাঁ : আমি উত্তর অন্য কারো প্রশ্নে যে আমার পথ পদস্খলিত stackoverflow.com/a/21167108/2501018
8one6

@ জোয়েলটজ আপনি কি ম্যাটপ্ল্লোলিব ডক্সে এর (পরিবর্তিত) সংস্করণ অবদান রাখতে রাজি হবেন? যদি তা হয় তবে হয় কেবল একটি জনসংযোগ খুলুন বা ইমেলের মাধ্যমে আমাকে পিং করুন (আমার প্রোফাইল দেখুন)।
টাকাসওয়েল

12

পাইথন সিবোর্ন মডিউলটি ম্যাটপ্লোটিব-এর উপর ভিত্তি করে তৈরি করে এবং খুব সুন্দর হিটম্যাপ তৈরি করে।

নীচে আইপথন / জুপিটার নোটবুকের জন্য নকশা করা সমুদ্রের সাথে একটি বাস্তবায়ন রয়েছে।

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
# import the data directly into a pandas dataframe
nba = pd.read_csv("http://datasets.flowingdata.com/ppg2008.csv", index_col='Name  ')
# remove index title
nba.index.name = ""
# normalize data columns
nba_norm = (nba - nba.mean()) / (nba.max() - nba.min())
# relabel columns
labels = ['Games', 'Minutes', 'Points', 'Field goals made', 'Field goal attempts', 'Field goal percentage', 'Free throws made', 
          'Free throws attempts', 'Free throws percentage','Three-pointers made', 'Three-point attempt', 'Three-point percentage', 
          'Offensive rebounds', 'Defensive rebounds', 'Total rebounds', 'Assists', 'Steals', 'Blocks', 'Turnover', 'Personal foul']
nba_norm.columns = labels
# set appropriate font and dpi
sns.set(font_scale=1.2)
sns.set_style({"savefig.dpi": 100})
# plot it out
ax = sns.heatmap(nba_norm, cmap=plt.cm.Blues, linewidths=.1)
# set the x-axis labels on the top
ax.xaxis.tick_top()
# rotate the x-axis labels
plt.xticks(rotation=90)
# get figure (usually obtained via "fig,ax=plt.subplots()" with matplotlib)
fig = ax.get_figure()
# specify dimensions and save
fig.set_size_inches(15, 20)
fig.savefig("nba.png")

আউটপুটটি দেখতে এরকম দেখাচ্ছে: সমুদ্র সৈকত এনবিএ হিটম্যাপ আমি ম্যাটপ্ল্লিটিব ব্লুজ রঙের মানচিত্র ব্যবহার করেছি, তবে ব্যক্তিগতভাবে ডিফল্ট রঙগুলি বেশ সুন্দর খুঁজে পাই। আমি এক্স-অ্যাক্সেস লেবেলগুলি ঘোরানোর জন্য ম্যাটপ্লটলিব ব্যবহার করেছি, কারণ আমি সমুদ্র সৈকত সিনট্যাক্সটি খুঁজে পাইনি। গ্রিকসর দ্বারা উল্লিখিত হিসাবে, পরীক্ষার এবং ত্রুটির দ্বারা মাত্রা (ডুমুর.সেট_সাইজ_ইঞ্চগুলি) নির্দিষ্ট করা দরকার ছিল যা আমি কিছুটা হতাশাবোধ করি।

পল এইচ দ্বারা উল্লিখিত হিসাবে, আপনি তাপের মানচিত্রগুলিতে সহজেই মানগুলি যুক্ত করতে পারেন (এ্যানোট = ট্রু), তবে এই ক্ষেত্রে আমি এটি চিত্রের উন্নতি বলে মনে করি না। জোয়েলটজ চমৎকার উত্তর থেকে বেশ কয়েকটি কোড স্নিপেট নিয়েছিলেন।


11

মূল সমস্যাটি হ'ল আপনাকে প্রথমে আপনার x এবং y টিকের অবস্থান নির্ধারণ করতে হবে। এছাড়াও, এটি ম্যাটপ্ল্লিটিবকে আরও অবজেক্ট-ভিত্তিক ইন্টারফেস ব্যবহার করতে সহায়তা করে। যথা, axesঅবজেক্টের সাথে সরাসরি যোগাযোগ করুন।

import matplotlib.pyplot as plt
import numpy as np
column_labels = list('ABCD')
row_labels = list('WXYZ')
data = np.random.rand(4,4)
fig, ax = plt.subplots()
heatmap = ax.pcolor(data)

# put the major ticks at the middle of each cell, notice "reverse" use of dimension
ax.set_yticks(np.arange(data.shape[0])+0.5, minor=False)
ax.set_xticks(np.arange(data.shape[1])+0.5, minor=False)


ax.set_xticklabels(row_labels, minor=False)
ax.set_yticklabels(column_labels, minor=False)
plt.show()

আশা করি এইটি কাজ করবে.


ধন্যবাদ, @ পল এইচ, যা সুন্দরভাবে কাজ করে। আমি heatmap.axesসম্পত্তিটি ব্যবহার করছিলাম , যা কোনও কারণে কিছু করে না।
জেসন সুন্দরাম

আপনি কি জানেন যে কীভাবে এক্স-অক্ষের লেবেলগুলি শীর্ষে রাখতে হবে? আমি সুস্পষ্ট চেষ্টা করেছিলাম ax.xaxis.set_label_position('top')কোনও লাভ হয়নি।
জেসন সুন্দরাম

@ জেসনসুন্দরাম আপনার লেবেল পজিশনিং সরিয়ে নেওয়ার জন্য একটি নতুন প্রশ্ন খুলতে হবে, কারণ এটি কাজ করা উচিত এবং এটি আশ্চর্যজনক যে এটি হয় না।
টাকাসওয়েল

1
@ ট্যাকসওয়েল, ভালো কথা। এখানে নতুন প্রশ্ন: স্ট্যাকওভারফ্লো.com
জেসন সুন্দ্রম

1
@ টগস্মিথ 15১91৯৯ আমি সমুদ্রের হটম্যাপ ফাংশনটি ব্যবহার করব, annot=Trueযখন কল করা হবে সেটিং ( স্ট্যানফোর্ড.ইডু / ~মওয়াসকোম / সোফটওয়্যার / স্যাবার্ন / জেনারেটেড/… )
পল এইচ

3

আমার ব্যবহার করা কোড সরানোর জন্য কেউ এই প্রশ্নটি সম্পাদনা করেছেন, তাই আমাকে উত্তর হিসাবে যুক্ত করতে বাধ্য করা হয়েছিল। যারা এই প্রশ্নের উত্তরে অংশ নিয়েছিলেন তাদের সবাইকে ধন্যবাদ! আমি মনে করি অন্যান্য কোডগুলির চেয়ে বেশিরভাগ উত্তরই এই কোডের চেয়ে ভাল I'm

পল এইচ , এবং আনটবু (যিনি এই প্রশ্নের উত্তর দিয়েছিলেন ) এর সাথে ধন্যবাদ জানাতে আমার বেশ কিছু সুন্দর চেহারা রয়েছে:

import matplotlib.pyplot as plt
import numpy as np
column_labels = list('ABCD')
row_labels = list('WXYZ')
data = np.random.rand(4,4)
fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=plt.cm.Blues)

# put the major ticks at the middle of each cell
ax.set_xticks(np.arange(data.shape[0])+0.5, minor=False)
ax.set_yticks(np.arange(data.shape[1])+0.5, minor=False)

# want a more natural, table-like display
ax.invert_yaxis()
ax.xaxis.tick_top()

ax.set_xticklabels(row_labels, minor=False)
ax.set_yticklabels(column_labels, minor=False)
plt.show()

এবং এখানে ফলাফল:

ম্যাটপ্ল্লিটিব হিটম্যাপ

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