স্ক্যাটার ডেটা সেট ব্যবহার করে MatPlotLib এ হিটম্যাপ তৈরি করুন


187

আমার কাছে এক্স, ওয়াই ডেটা পয়েন্ট (প্রায় 10 ক) এর একটি সেট রয়েছে যা স্কেটার প্লট হিসাবে প্লট করা সহজ তবে আমি হিটম্যাপ হিসাবে উপস্থাপন করতে চাই।

আমি ম্যাটপ্লটলিবের উদাহরণগুলি দেখেছি এবং তারা সকলেই ইমেজটি তৈরি করতে হিটম্যাপ সেল মানগুলি ইতিমধ্যে শুরু করেছে বলে মনে হচ্ছে।

এমন কোনও পদ্ধতি আছে যা এক্স, ওয়াই, সমস্ত আলাদা আলাদাকে একটি হিটম্যাপে রূপান্তর করে (যেখানে এক্স, y এর উচ্চতর ফ্রিকোয়েন্সি সহ অঞ্চলগুলি "উষ্ণ" হবে)?


উত্তর:


182

আপনি যদি হেক্সাগন না চান তবে আপনি নম্পির histogram2dফাংশনটি ব্যবহার করতে পারেন :

import numpy as np
import numpy.random
import matplotlib.pyplot as plt

# Generate some test data
x = np.random.randn(8873)
y = np.random.randn(8873)

heatmap, xedges, yedges = np.histogram2d(x, y, bins=50)
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]

plt.clf()
plt.imshow(heatmap.T, extent=extent, origin='lower')
plt.show()

এটি একটি 50x50 হিটম্যাপ তৈরি করে। যদি আপনি চান, 512x384 বলুন, আপনি bins=(512, 384)কলটিতে রাখতে পারেন histogram2d

উদাহরণ: Matplotlib তাপ মানচিত্র উদাহরণ


1
আমি বোকা হতে চাইছি না, তবে কেবলমাত্র ইন্টারেক্টিভ আইপিথন সেশনে প্রদর্শন করার পরিবর্তে আপনি কীভাবে এই আউটপুটটিকে পিএনজি / পিডিএফ ফাইলে রাখবেন? আমি এটিকে কিছুটা সাধারণ axesউদাহরণ হিসাবে পাওয়ার চেষ্টা করছি , যেখানে আমি একটি শিরোনাম, অক্ষের লেবেল ইত্যাদি যুক্ত করতে পারি এবং তারপরে savefig()আমি অন্য কোনও সাধারণ ম্যাটপ্ল্লিটিব প্লটের জন্য সাধারণ কাজটি করতে পারি।
gotgenes

3
@ গোটজেনেস: plt.savefig('filename.png')কাজ করে না ? আপনি যদি একটি অক্ষ উদাহরণ পেতে চান, ম্যাটপ্ল্লোলিবের অবজেক্ট-ভিত্তিক ইন্টারফেসটি ব্যবহার করুন:fig = plt.figure() ax = fig.gca() ax.imshow(...) fig.savefig(...)
টোটোমাট

1
সত্যিই, ধন্যবাদ! আমি অনুমান করি যে আমি সম্পূর্ণরূপে বুঝতে পারি না যে imshow()একই ধরণের ক্রিয়াকলাপে scatter()। আমি সত্যই বুঝতে পারি না যে কেন imshow()একটি 2 ডি অ্যারে ভাসমান রঙকে উপযুক্ত রঙের ব্লকগুলিতে রূপান্তর করে, আমি বুঝতে পারি না যে scatter()এই জাতীয় অ্যারের সাথে কী করা উচিত to
gotgenes

14
এক্স / ওয়াইয়ের মানগুলির মতো 2 ডি হিস্টোগ্রাম প্লট করার জন্য ইমশো ব্যবহার সম্পর্কে একটি সতর্কতা: ডিফল্টরূপে, উপরের বাম কোণে উত্সটি প্লট করে চিত্রটি স্থানান্তর করে। আমি একটি বিচ্ছুরণের প্লটের মতো একই দিকনির্দেশ পেতে যা করব তা হ'লplt.imshow(heatmap.T, extent=extent, origin = 'lower')
জেমি

7
কি অনুপস্থিত তাদের জন্য একটি লগারিদমিক colorbar এই প্রশ্ন দেখতে পাবেন stackoverflow.com/questions/17201172/... কেবল নাfrom matplotlib.colors import LogNorm plt.imshow(heatmap, norm=LogNorm()) plt.colorbar()
tommy.carstensen

109

ইন Matplotlib লেক্সিকন, আমি আপনাকে একটি চান hexbin চক্রান্ত।

আপনি যদি এই ধরণের প্লটের সাথে পরিচিত না হন তবে এটি কেবল একটি দ্বিবিভক্ত হিস্টোগ্রামে যেখানে এক্স ওয়্যার প্লেনটি নিয়মিত হেক্সাগনগুলির একটি গ্রিড দ্বারা পরীক্ষা করা হয়।

সুতরাং একটি হিস্টোগ্রাম থেকে, আপনি কেবল প্রতিটি ষড়ভুজের পয়েন্টের সংখ্যা গণনা করতে পারবেন, প্লটিং অঞ্চলটিকে উইন্ডোজ একটি সেট হিসাবে বিবেচনা করতে পারবেন , প্রতিটি বিন্দুকে এই উইন্ডোগুলির একটিতে নির্ধারণ করুন; অবশেষে, উইন্ডোজগুলি রঙিন অ্যারেতে মানচিত্র করুন এবং আপনার একটি হেক্সবিন ডায়াগ্রাম পেয়েছে।

উদাহরণস্বরূপ, চেনাশোনা বা স্কোয়ারের চেয়ে কম ব্যবহার করা হলেও হেনসাগনগুলি বেনিং ধারকের জ্যামিতির জন্য আরও ভাল পছন্দ স্বজ্ঞাত:

  • hexagons আছে নিকটতম-প্রতিবেশী প্রতিসাম্য (যেমন, বর্গাকার বিন না, যেমন, দূরত্ব না থেকে একটি বর্গক্ষেত্র এর সীমান্তে একটি বিন্দু থেকে যে বর্গক্ষেত্র ভিতরে একটি বিন্দু না সর্বত্র সমান) এবং

  • ষড়ভুজ হ'ল সর্বোচ্চ এন-বহুভুজ যা নিয়মিত বিমানের টেস্টেলেশন দেয় (অর্থাত্, আপনি নিরাপদে নিজের রান্নাঘরের মেঝেটি ষড়্ভুজাকৃতির আকারের টাইলসের সাথে পুনরায় মডেল করতে পারেন কারণ টাইলসের মধ্যে কোনও অকার্যকর স্থান থাকবে না যখন আপনি শেষ করেন - এটি সত্য নয়) অন্যান্য সমস্ত উচ্চতর এন, এন> = 7, বহুভুজ)।

( ম্যাটপ্লটলিব হ্যাক্সবিন প্লট শব্দটি ব্যবহার করেছেন ; আর এর জন্য প্লট করা সমস্ত গ্রন্থাগার হ'ল ( এএএফআইকে ) ; এখনও আমি জানি না যে এই ধরণের প্লটের জন্য এটি সাধারণত গৃহীত শব্দ, যদিও আমার সন্দেহ হয় যে সম্ভবত হেক্সবিন সংক্ষিপ্ত জন্য ষড়্ভুজাকার binning , ডিসপ্লে জন্য তথ্য প্রস্তুত অপরিহার্য পদক্ষেপ বর্ণনা করে যা।)


from matplotlib import pyplot as PLT
from matplotlib import cm as CM
from matplotlib import mlab as ML
import numpy as NP

n = 1e5
x = y = NP.linspace(-5, 5, 100)
X, Y = NP.meshgrid(x, y)
Z1 = ML.bivariate_normal(X, Y, 2, 2, 0, 0)
Z2 = ML.bivariate_normal(X, Y, 4, 1, 1, 1)
ZD = Z2 - Z1
x = X.ravel()
y = Y.ravel()
z = ZD.ravel()
gridsize=30
PLT.subplot(111)

# if 'bins=None', then color of each hexagon corresponds directly to its count
# 'C' is optional--it maps values to x-y coordinates; if 'C' is None (default) then 
# the result is a pure 2D histogram 

PLT.hexbin(x, y, C=z, gridsize=gridsize, cmap=CM.jet, bins=None)
PLT.axis([x.min(), x.max(), y.min(), y.max()])

cb = PLT.colorbar()
cb.set_label('mean value')
PLT.show()   

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


"হেক্সাগনগুলির নিকটতম-প্রতিবেশী প্রতিসাম্য আছে" এর অর্থ কী? আপনি বলেছেন যে "একটি বর্গাকার সীমান্তের বিন্দু থেকে দূরত্ব এবং সেই বর্গাকার অভ্যন্তরের বিন্দু সর্বত্র সমান নয়" তবে দূরত্ব কী?
জান

9
ষড়ভুজের জন্য, কেন্দ্র থেকে একদিকের উভয় দিকের সাথে যোগ করা একটি মাঝের থেকে মধ্যবর্তী দূরত্বও কেবল এক অনুপাতের চেয়ে কম (2 / বর্গক্ষেত্র (3) ≈ 1.15 ষড়্ভুজ বনাম স্কয়ার্ট (2) ≈ 1.41 এর জন্য) বর্গক্ষেত্রের জন্য)। একমাত্র আকৃতি যেখানে কেন্দ্র থেকে সীমান্তের প্রতিটি পয়েন্টের দূরত্ব সমান।
জান

5
@ জায়ান হেক্সাগনের জন্য, প্রতিটি প্রতিবেশী একই দূরত্বে রয়েছে। 8-পাড়া বা 4-পাড়ায় কোনও সমস্যা নেই। তির্যক প্রতিবেশী নয়, কেবল এক ধরণের প্রতিবেশী।
ইসরান্দি

@ ডগ আপনি কীভাবে gridsize=প্যারামিটারটি চয়ন করেন । আমি এটি এ জাতীয় পছন্দ করতে চাই, যাতে ষড়যন্ত্রগুলি ওভারল্যাপিং ছাড়াই কেবল স্পর্শ করে। আমি লক্ষ্য করেছি যে gridsize=100আরও ছোট হেক্সাগন তৈরি করবে, তবে সঠিক মানটি কীভাবে চয়ন করবেন?
আলেকজান্ডার Cska

40

সম্পাদনা করুন: আলেজান্দ্রোর উত্তরের আরও ভাল অনুমানের জন্য, নীচে দেখুন।

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আলেজান্দ্রোর আনসারটিতে কিছু যুক্ত করতে চেয়েছিলেন: পাই-স্পাইভিউয়ার ব্যবহার না করে আপনি যদি একটি সুন্দর স্মুথড চিত্র চান তবে আপনি পরিবর্তে হিটম্যাপে np.histogram2dগাউসিয়ান ফিল্টারটি ব্যবহার করতে পারেন (থেকে scipy.ndimage.filters):

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from scipy.ndimage.filters import gaussian_filter


def myplot(x, y, s, bins=1000):
    heatmap, xedges, yedges = np.histogram2d(x, y, bins=bins)
    heatmap = gaussian_filter(heatmap, sigma=s)

    extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
    return heatmap.T, extent


fig, axs = plt.subplots(2, 2)

# Generate some test data
x = np.random.randn(1000)
y = np.random.randn(1000)

sigmas = [0, 16, 32, 64]

for ax, s in zip(axs.flatten(), sigmas):
    if s == 0:
        ax.plot(x, y, 'k.', markersize=5)
        ax.set_title("Scatter plot")
    else:
        img, extent = myplot(x, y, s)
        ax.imshow(img, extent=extent, origin='lower', cmap=cm.jet)
        ax.set_title("Smoothing with  $\sigma$ = %d" % s)

plt.show()

উত্পাদন:

আউটপুট ইমেজ

আগাগাল গাল্লোর জন্য প্রত্যেকটির উপরে স্ক্যাটার প্লট এবং s = 16 প্লট করা হয়েছে (আরও ভাল দেখার জন্য ক্লিক করুন):

প্রত্যেকের উপরে


আমার গাউসীয় ফিল্টার পদ্ধতির সাথে এবং আলেজান্দ্রোর পদ্ধতির সাথে আমি একটি পার্থক্য লক্ষ্য করেছি যে তার পদ্ধতিটি স্থানীয় কাঠামো আমার চেয়ে অনেক বেশি ভাল দেখায়। অতএব আমি পিক্সেল স্তরে একটি সহজ নিকটতম প্রতিবেশী পদ্ধতি প্রয়োগ করেছি। এই পদ্ধতিটি প্রতিটি পিক্সেলের জন্য nডেটার নিকটতম পয়েন্টগুলির দূরত্বগুলির বিপরীত সমষ্টি গণনা করে। এই পদ্ধতিটি উচ্চতর রেজোলিউশনে খুব কম গণনামূলকভাবে ব্যয়বহুল এবং আমি মনে করি একটি দ্রুত উপায় আছে, সুতরাং আপনার কোনও উন্নতি হয়েছে কিনা তা আমাকে জানান me

আপডেট: আমার সন্দেহ হিসাবে, স্কিপি ব্যবহার করে আরও দ্রুত পদ্ধতি রয়েছে scipy.cKDTree। বাস্তবায়নের জন্য গ্যাব্রিয়েলের উত্তর দেখুন ।

যাইহোক, এখানে আমার কোড:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm


def data_coord2view_coord(p, vlen, pmin, pmax):
    dp = pmax - pmin
    dv = (p - pmin) / dp * vlen
    return dv


def nearest_neighbours(xs, ys, reso, n_neighbours):
    im = np.zeros([reso, reso])
    extent = [np.min(xs), np.max(xs), np.min(ys), np.max(ys)]

    xv = data_coord2view_coord(xs, reso, extent[0], extent[1])
    yv = data_coord2view_coord(ys, reso, extent[2], extent[3])
    for x in range(reso):
        for y in range(reso):
            xp = (xv - x)
            yp = (yv - y)

            d = np.sqrt(xp**2 + yp**2)

            im[y][x] = 1 / np.sum(d[np.argpartition(d.ravel(), n_neighbours)[:n_neighbours]])

    return im, extent


n = 1000
xs = np.random.randn(n)
ys = np.random.randn(n)
resolution = 250

fig, axes = plt.subplots(2, 2)

for ax, neighbours in zip(axes.flatten(), [0, 16, 32, 64]):
    if neighbours == 0:
        ax.plot(xs, ys, 'k.', markersize=2)
        ax.set_aspect('equal')
        ax.set_title("Scatter Plot")
    else:
        im, extent = nearest_neighbours(xs, ys, resolution, neighbours)
        ax.imshow(im, origin='lower', extent=extent, cmap=cm.jet)
        ax.set_title("Smoothing over %d neighbours" % neighbours)
        ax.set_xlim(extent[0], extent[1])
        ax.set_ylim(extent[2], extent[3])
plt.show()

ফলাফল:

নিকটবর্তী নিকটবর্তী স্মুথিং


1
এটা খুবই পছন্দ করি. গ্রাফ আলেজান্দ্রোর উত্তরের মতো দুর্দান্ত, তবে কোনও নতুন প্যাকেজের প্রয়োজন নেই।
নাথান ক্লিমেন্ট 21

খুব সুন্দর ! তবে আপনি এই পদ্ধতিটি দিয়ে একটি অফসেট তৈরি করেন। আপনি এটি রঙিনের সাথে একটি সাধারণ স্ক্যাটার গ্রাফের সাথে তুলনা করে দেখতে পারেন। আপনি এটি সংশোধন করতে কিছু যুক্ত করতে পারেন? বা শুধু x এবং y মান দ্বারা গ্রাফ সরানো?
আগপে গাললো

1
আগপে গাললো, তুমি অফসেট দিয়ে কী বোঝাতে চাইছ? যদি আপনি তাদের উপরের পরিকল্পনা করেন তবে তারা মিলছে (আমার পোস্টের সম্পাদনা দেখুন)। সম্ভবত আপনি বন্ধ হয়ে গেছেন কারণ স্ক্যাটারের প্রস্থ অন্য তিনটির সাথে ঠিক মেলে না।
জুরজি

শুধু আমার জন্য গ্রাফ প্লট করার জন্য অনেক অনেক ধন্যবাদ! আমি আমার ভুল বুঝতে পেরেছি: আমি এক্স এবং ওয়াই সীমা নির্ধারণ করতে "সীমা" পরিবর্তন করেছি। আমি এখন বুঝতে পারি এটি গ্রাফের উত্সকে পরিবর্তন করেছে। তারপরে, আমার একটি শেষ প্রশ্ন আছে: আমি কীভাবে গ্রাফের সীমাটি প্রসারিত করতে পারি, এমনকি এমন অঞ্চলের জন্যও যেখানে বিদ্যমান ডেটা নেই? উদাহরণস্বরূপ, x এবং y এর জন্য -5 থেকে +5 এর মধ্যে।
আগপে গ্যালো

1
বলুন আপনি x অক্ষটি -5 থেকে 5 এবং y অক্ষটি -3 থেকে 4 পর্যন্ত যেতে চান; মধ্যে myplotফাংশন, যোগ rangeকরার পরামিতি np.histogram2d: np.histogram2d(x, y, bins=bins, range=[[-5, 5], [-3, 4]])এবং জন্য-লুপ x এবং অক্ষের Y লিম সেট করুন: ax.set_xlim([-5, 5]) ax.set_ylim([-3, 4])। অতিরিক্তভাবে, ডিফল্টরূপে, imshowঅনুপাতটি আপনার অক্ষগুলির অনুপাতের সাথে অভিন্ন রাখে (সুতরাং আমার উদাহরণে 10: 7 এর অনুপাত), তবে আপনি যদি এটি আপনার প্লট উইন্ডোর সাথে মেলে চান তবে প্যারামিটারটি যুক্ত aspect='auto'করুন imshow
জুরজি

31

Np.hist2d ব্যবহার করার পরিবর্তে, যা সাধারণত বেশ কুৎসিত হিস্টোগ্রাম উত্পাদন করে, আমি পাই -স্প্হভিউয়ারকে পুনর্ব্যবহার করতে চাই , একটি অভিযোজক স্মুথিং কার্নেল ব্যবহার করে কণা সিমুলেশন রেন্ডার করার জন্য পাইথন প্যাকেজ এবং এটি পিপ থেকে সহজেই ইনস্টল করা যেতে পারে (ওয়েবপেজ ডকুমেন্টেশন দেখুন)। নিম্নলিখিত কোডটি বিবেচনা করুন, যা উদাহরণের ভিত্তিতে:

import numpy as np
import numpy.random
import matplotlib.pyplot as plt
import sphviewer as sph

def myplot(x, y, nb=32, xsize=500, ysize=500):   
    xmin = np.min(x)
    xmax = np.max(x)
    ymin = np.min(y)
    ymax = np.max(y)

    x0 = (xmin+xmax)/2.
    y0 = (ymin+ymax)/2.

    pos = np.zeros([3, len(x)])
    pos[0,:] = x
    pos[1,:] = y
    w = np.ones(len(x))

    P = sph.Particles(pos, w, nb=nb)
    S = sph.Scene(P)
    S.update_camera(r='infinity', x=x0, y=y0, z=0, 
                    xsize=xsize, ysize=ysize)
    R = sph.Render(S)
    R.set_logscale()
    img = R.get_image()
    extent = R.get_extent()
    for i, j in zip(xrange(4), [x0,x0,y0,y0]):
        extent[i] += j
    print extent
    return img, extent

fig = plt.figure(1, figsize=(10,10))
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
ax4 = fig.add_subplot(224)


# Generate some test data
x = np.random.randn(1000)
y = np.random.randn(1000)

#Plotting a regular scatter plot
ax1.plot(x,y,'k.', markersize=5)
ax1.set_xlim(-3,3)
ax1.set_ylim(-3,3)

heatmap_16, extent_16 = myplot(x,y, nb=16)
heatmap_32, extent_32 = myplot(x,y, nb=32)
heatmap_64, extent_64 = myplot(x,y, nb=64)

ax2.imshow(heatmap_16, extent=extent_16, origin='lower', aspect='auto')
ax2.set_title("Smoothing over 16 neighbors")

ax3.imshow(heatmap_32, extent=extent_32, origin='lower', aspect='auto')
ax3.set_title("Smoothing over 32 neighbors")

#Make the heatmap using a smoothing over 64 neighbors
ax4.imshow(heatmap_64, extent=extent_64, origin='lower', aspect='auto')
ax4.set_title("Smoothing over 64 neighbors")

plt.show()

যা নিম্নলিখিত চিত্র উত্পাদন করে:

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

আপনি যেমন দেখতে পাচ্ছেন, চিত্রগুলি দেখতে বেশ সুন্দর দেখাচ্ছে এবং আমরা এটিতে বিভিন্ন কাঠামো সনাক্ত করতে সক্ষম হয়েছি। এই ছবিগুলো নির্মাণ একটি নির্দিষ্ট ডোমেনের মধ্যে যে পয়েন্টের জন্য একটি প্রদত্ত ওজন ছড়িয়ে পড়ছে, মসৃণকরণ দৈর্ঘ্য, যা পালাক্রমে কাছাকাছি দূরত্ব দেওয়া হয় দ্বারা সংজ্ঞায়িত বিশেষ দ্রষ্টব্য প্রতিবেশী (আমি 16, 32 এবং 64 উদাহরণের জন্য চয়ন করেছেন)। সুতরাং, উচ্চ ঘনত্ব অঞ্চলগুলি সাধারণত নিম্ন ঘনত্ব অঞ্চলের তুলনায় ছোট অঞ্চলে ছড়িয়ে থাকে।

ফাংশন মাইপ্লটটি একটি খুব সাধারণ ফাংশন যা আমি লিখেছিলাম যে জাদুটি করার জন্য পাই, স্পাইভিউয়ারকে এক্স, ওয়াই ডেটা দেওয়ার জন্য।


2
ওএসএক্সে পাই-স্পাইভিউয়ার ইনস্টল করার চেষ্টা করা যে কারও পক্ষে একটি মন্তব্য: আমার বেশ অসুবিধা হয়েছিল, দেখুন: github.com/alejandrobll/py-sphviewer/issues/3
স্যাম ফিনিগান

খুব খারাপ এটি পাইথন 3 নিয়ে কাজ করে না। এটি ইনস্টল হয় তবে আপনি এটি ব্যবহার করার চেষ্টা করার পরে ক্র্যাশ হয়ে যায় ...
ফ্যাবিও ডায়াস

1
@ ফ্যাবিও ডায়াস, সর্বশেষতম সংস্করণ (1.1.x) এখন পাইথন 3
আলেজান্দ্রো


17

সিউর্ন এখন যৌথপ্লেট ফাংশন রয়েছে যা এখানে সুন্দরভাবে কাজ করা উচিত:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# Generate some test data
x = np.random.randn(8873)
y = np.random.randn(8873)

sns.jointplot(x=x, y=y, kind='hex')
plt.show()

ডেমো ইমেজ


সহজ, সুন্দর এবং বিশ্লেষণাত্মকভাবে দরকারী।
রায়ানজডিলন

@WWWearhewise আপনি কীভাবে 600k ডেটা এটি ব্যবহার করে চাক্ষুষভাবে পাঠযোগ্য করে তুলবেন? (কীভাবে আকার পরিবর্তন করবেন)
শে

আপনি কী বলতে চাইছেন তা আমি নিশ্চিত নই; সম্ভবত সেরা আপনি আলাদা প্রশ্ন জিজ্ঞাসা করুন এবং এখানে লিঙ্ক করুন। আপনি পুরো ডুমুরের আকার বদলেছেন? প্রথম চিত্রে করা fig = plt.figure(figsize=(12, 12)), তারপর বর্তমান অক্ষ পেতে ax=plt.gca(), তারপর যুক্তি যোগ ax=axকরার jointplotফাংশন।
শব্দসুখে

: @wordsforthewise আপনি যদি এই প্রশ্নের উত্তর দিন ত stackoverflow.com/questions/50997662/... ধন্যবাদ
ebrahimi

4

এবং প্রাথমিক প্রশ্নটি ছিল ... কীভাবে স্ক্যাটারের মানগুলি গ্রিডের মানগুলিতে রূপান্তর করা যায়, তাই না? histogram2dযাইহোক, প্রতি সেল প্রতি ফ্রিকোয়েন্সি গণনা করে তবে আপনার কাছে কেবলমাত্র ফ্রিকোয়েন্সি ব্যতীত অন্য সেল ডেটা থাকলে আপনার কিছু অতিরিক্ত কাজ করতে হবে।

x = data_x # between -10 and 4, log-gamma of an svc
y = data_y # between -4 and 11, log-C of an svc
z = data_z #between 0 and 0.78, f1-values from a difficult dataset

সুতরাং, আমার কাছে এক্স এবং ওয়াই স্থানাঙ্কের জেড-ফলাফল সহ একটি ডেটাসেট রয়েছে। যাইহোক, আমি আগ্রহের ক্ষেত্রের বাইরে কয়েকটি পয়েন্ট (বৃহত ফাঁক) এবং আগ্রহের একটি ছোট ক্ষেত্রে পয়েন্টের গাদা গণনা করছিলাম।

হ্যাঁ এখানে এটি আরও কঠিন হয়ে ওঠে তবে আরও মজাদার। কিছু গ্রন্থাগার (দুঃখিত):

from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np
from scipy.interpolate import griddata

পাইপ্লট আজ আমার গ্রাফিক ইঞ্জিন, সেন্টিমিটার কিছু ইনট্রেস্টিং পছন্দ সহ রঙিন মানচিত্রের একটি পরিসর। গণনার জন্য নির্লিপ্ত, এবং একটি নির্দিষ্ট গ্রিডে মান সংযুক্ত করার জন্য গ্রিডাটা।

শেষটি গুরুত্বপূর্ণ কারণ বিশেষ করে xy পয়েন্টগুলির ফ্রিকোয়েন্সি আমার ডেটাতে সমানভাবে বিতরণ করা হয়নি। প্রথমত, আমার ডেটা এবং একটি স্বেচ্ছাসেবী গ্রিডের আকারের সাথে মানানসই কিছু সীমারেখা দিয়ে শুরু করি। মূল ডেটাতে সেই এক্স এবং ওয়াইয়ের সীমানার বাইরেও ডেটাপয়েন্ট রয়েছে।

#determine grid boundaries
gridsize = 500
x_min = -8
x_max = 2.5
y_min = -2
y_max = 7

সুতরাং আমরা x এবং y এর সর্বনিম্ন এবং সর্বোচ্চ মানের মধ্যে 500 পিক্সেল সহ একটি গ্রিড সংজ্ঞায়িত করেছি।

আমার তথ্যগুলিতে, উচ্চ আগ্রহের ক্ষেত্রে উপলব্ধ 500 টিরও বেশি মূল্য রয়েছে; যদিও স্বল্প-স্বল্প-অঞ্চলে, মোট গ্রিডে 200 মানও নেই; এর গ্রাফিক সীমানার মধ্যে x_minএবং x_maxএর চেয়েও কম রয়েছে।

সুতরাং একটি সুন্দর ছবি পাওয়ার জন্য, কাজটি হ'ল উচ্চ সুদের মানগুলির জন্য গড় পেতে এবং অন্য কোথাও শূন্যস্থান পূরণ করা।

আমি এখন আমার গ্রিড সংজ্ঞায়িত করছি। প্রতিটি এক্সএক্সওয়াই জুটির জন্য, আমি একটি রঙ চাই।

xx = np.linspace(x_min, x_max, gridsize) # array of x values
yy = np.linspace(y_min, y_max, gridsize) # array of y values
grid = np.array(np.meshgrid(xx, yy.T))
grid = grid.reshape(2, grid.shape[1]*grid.shape[2]).T

আজব আকৃতি কেন? scipy.griddata (n, D) এর আকার চায়।

গ্রিডটা পূর্বনির্ধারিত পদ্ধতিতে গ্রিডে প্রতি বিন্দুতে একটি মান গণনা করে। আমি "নিকটতম" বেছে নিই - খালি গ্রিড পয়েন্টগুলি নিকটবর্তী প্রতিবেশী থেকে মান পূরণ করা হবে। এটি দেখে মনে হচ্ছে যেন কম তথ্যযুক্ত অঞ্চলে বড় কক্ষ থাকে (এমনকি এটি না হলেও)। কেউ "রৈখিক" বিভক্ত করা বেছে নিতে পারে, তারপরে কম তথ্য সহ অঞ্চলগুলি কম তীক্ষ্ণ দেখায়। স্বাদের বিষয়, সত্যই।

points = np.array([x, y]).T # because griddata wants it that way
z_grid2 = griddata(points, z, grid, method='nearest')
# you get a 1D vector as result. Reshape to picture format!
z_grid2 = z_grid2.reshape(xx.shape[0], yy.shape[0])

এবং হ্যাপ, আমরা প্লটটি প্রদর্শনের জন্য ম্যাটপ্ল্লোলিবের কাছে হস্তান্তর করি

fig = plt.figure(1, figsize=(10, 10))
ax1 = fig.add_subplot(111)
ax1.imshow(z_grid2, extent=[x_min, x_max,y_min, y_max,  ],
            origin='lower', cmap=cm.magma)
ax1.set_title("SVC: empty spots filled by nearest neighbours")
ax1.set_xlabel('log gamma')
ax1.set_ylabel('log C')
plt.show()

ভি-শেপের মূল অংশের চারপাশে, আপনি দেখতে পাচ্ছেন যে মিষ্টি স্পটটি অনুসন্ধানের সময় আমি প্রচুর গণনা করেছি, অন্যদিকে প্রায় সব জায়গাতেই কম আকর্ষণীয় অংশগুলির রেজোলিউশন কম রয়েছে।

উচ্চ রেজোলিউশনে একটি এসভিসির হিটম্যাপ


আপনি সম্পূর্ণ এবং চলমান কোড আছে আপনার উত্তর উন্নত করতে পারেন? এটি আপনার দেওয়া একটি আকর্ষণীয় পদ্ধতি। আমি এই মুহূর্তে এটি আরও ভাল করে বোঝার চেষ্টা করছি। কেন ভি ভি আকার আছে তা আমি পুরোপুরি বুঝতে পারি না। ধন্যবাদ।
ldmtwo

ভি-শেপটি আমার ডেটা থেকে আসে। এটি প্রশিক্ষিত এসভিএমের জন্য এফ 1-মান: এটি এসভিএমের তত্ত্বে কিছুটা এগিয়ে চলেছে। আপনার যদি উচ্চতর সি থাকে, তবে এটি বিস্তৃত গামা পরিসীমা কাজ করার জন্য মঞ্জুরিতে আপনার সমস্ত পয়েন্ট অন্তর্ভুক্ত করে। গামা হ'ল ভাল-মন্দকে আলাদা করে দেওয়া বাঁকটির শক্ততা। এই দুটি মান এসভিএমকে দিতে হবে (আমার গ্রাফিকের এক্স এবং ওয়াই); তারপরে আপনি একটি ফলাফল পাবেন (আমার গ্রাফিকের জেড)। সেরা অঞ্চলে আপনি অর্থবহ উচ্চতা লাভের আশায় রয়েছেন।
Anderas

দ্বিতীয় চেষ্টা: ভি-শেপটি আমার ডেটাতে রয়েছে। এটি কোনও এসভিএমের জন্য এফ 1-মান: যদি আপনার উচ্চ সি থাকে তবে এটি গণনাতে আপনার সমস্ত পয়েন্ট অন্তর্ভুক্ত করে, একটি বিস্তৃত গামা পরিসীমা কাজ করার অনুমতি দেয় তবে গণনাটি ধীর করে দেয়। গামা হ'ল ভাল-মন্দকে আলাদা করে দেওয়া বাঁকটির শক্ততা। এই দুটি মান এসভিএমকে দিতে হবে (আমার গ্রাফিকের এক্স এবং ওয়াই); তারপরে আপনি একটি ফলাফল পাবেন (আমার গ্রাফিকের জেড)। অপ্টিমাইজড এরিয়ায় আপনি উচ্চতর মান পাবেন অন্য কোথাও কম মান। আমি এখানে যা দেখিয়েছি তা ব্যবহারযোগ্য যদি আপনার কয়েকটি (এক্স, ওয়াই) এর জেড-মান থাকে এবং অন্য কোথাও অনেক ফাঁক থাকে। আপনার যদি (এক্স, ওয়াই, জেড) ডেটাপয়েন্ট থাকে তবে আপনি আমার কোডটি ব্যবহার করতে পারেন।
অ্যান্ড্রেস

4

এখানে জুরগির দুর্দান্ত নিকটতম প্রতিবেশী পদ্ধতি রয়েছে তবে স্কিপি.সি.কেডিট্রি ব্যবহার করে প্রয়োগ করা হয়েছে । আমার পরীক্ষায় এটি প্রায় 100x দ্রুত।

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

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from scipy.spatial import cKDTree


def data_coord2view_coord(p, resolution, pmin, pmax):
    dp = pmax - pmin
    dv = (p - pmin) / dp * resolution
    return dv


n = 1000
xs = np.random.randn(n)
ys = np.random.randn(n)

resolution = 250

extent = [np.min(xs), np.max(xs), np.min(ys), np.max(ys)]
xv = data_coord2view_coord(xs, resolution, extent[0], extent[1])
yv = data_coord2view_coord(ys, resolution, extent[2], extent[3])


def kNN2DDens(xv, yv, resolution, neighbours, dim=2):
    """
    """
    # Create the tree
    tree = cKDTree(np.array([xv, yv]).T)
    # Find the closest nnmax-1 neighbors (first entry is the point itself)
    grid = np.mgrid[0:resolution, 0:resolution].T.reshape(resolution**2, dim)
    dists = tree.query(grid, neighbours)
    # Inverse of the sum of distances to each grid point.
    inv_sum_dists = 1. / dists[0].sum(1)

    # Reshape
    im = inv_sum_dists.reshape(resolution, resolution)
    return im


fig, axes = plt.subplots(2, 2, figsize=(15, 15))
for ax, neighbours in zip(axes.flatten(), [0, 16, 32, 63]):

    if neighbours == 0:
        ax.plot(xs, ys, 'k.', markersize=5)
        ax.set_aspect('equal')
        ax.set_title("Scatter Plot")
    else:

        im = kNN2DDens(xv, yv, resolution, neighbours)

        ax.imshow(im, origin='lower', extent=extent, cmap=cm.Blues)
        ax.set_title("Smoothing over %d neighbours" % neighbours)
        ax.set_xlim(extent[0], extent[1])
        ax.set_ylim(extent[2], extent[3])

plt.savefig('new.png', dpi=150, bbox_inches='tight')

1
আমি জানতাম যে আমার বাস্তবায়নটি খুব অদক্ষ, কিন্তু সিকেডিট্রি সম্পর্কে জানতাম না। সাবাশ! আমি আমার উত্তরে আপনাকে রেফারেন্স করব।
জুরজি

2

2-মাত্রিক অ্যারে তৈরি করুন যা আপনার চূড়ান্ত চিত্রের কক্ষগুলির সাথে সামঞ্জস্য রাখে, যাকে বলা হয় heatmap_cells এবং এটি সমস্ত শূন্য হিসাবে ইনস্ট্যান্ট করুন।

দুটি স্কেলিং ফ্যাক্টর চয়ন করুন যা প্রতিটি ইউনিটের প্রতিটি অ্যারে উপাদানের মধ্যে পার্থক্য নির্ধারণ করে, প্রতিটি মাত্রার জন্য, বলে x_scaleএবংy_scale । এগুলি চয়ন করুন যে আপনার সমস্ত ডেটাপয়েন্টগুলি হিটম্যাপ অ্যারের সীমানার মধ্যে চলে আসবে।

প্রতিটি কাঁচা ডেটাপয়েন্টের সাথে x_valueএবং y_value:

heatmap_cells[floor(x_value/x_scale),floor(y_value/y_scale)]+=1


1

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

আমি এখানে 3 টি বিভাগ (রঙিন লাল, সবুজ এবং নীল) দিয়ে 1 মিলিয়ন পয়েন্ট সেট করেছি। আপনি যদি ফাংশনটি দেখতে চান তবে এখানে সংগ্রহস্থলের একটি লিঙ্ক রয়েছে। গিথুব রেপো

histplot(
    X,
    Y,
    labels,
    bins=2000,
    range=((-3,3),(-3,3)),
    normalize_each_label=True,
    colors = [
        [1,0,0],
        [0,1,0],
        [0,0,1]],
    gain=50)

0

@ পিতির উত্তরের সাথে খুব সমান , তবে পয়েন্টগুলি তৈরি করতে 2 এর পরিবর্তে 1 টি কল ব্যবহার করা হচ্ছে:

import numpy as np
import matplotlib.pyplot as plt

pts = 1000000
mean = [0.0, 0.0]
cov = [[1.0,0.0],[0.0,1.0]]

x,y = np.random.multivariate_normal(mean, cov, pts).T
plt.hist2d(x, y, bins=50, cmap=plt.cm.jet)
plt.show()

আউটপুট:

2d_gaussian_heatmap


0

আমি আশঙ্কা করছি আমি পার্টিতে কিছুটা দেরি করেছি তবে কিছুক্ষণ আগে আমারও একই রকম প্রশ্ন ছিল। গৃহীত উত্তর (@ টমোটো দ্বারা) আমাকে সাহায্য করেছে তবে কারওর ব্যবহারের ক্ষেত্রে আমি এটি পোস্ট করতে চাই।


''' I wanted to create a heatmap resembling a football pitch which would show the different actions performed '''

import numpy as np
import matplotlib.pyplot as plt
import random

#fixing random state for reproducibility
np.random.seed(1234324)

fig = plt.figure(12)
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)

#Ratio of the pitch with respect to UEFA standards 
hmap= np.full((6, 10), 0)
#print(hmap)

xlist = np.random.uniform(low=0.0, high=100.0, size=(20))
ylist = np.random.uniform(low=0.0, high =100.0, size =(20))

#UEFA Pitch Standards are 105m x 68m
xlist = (xlist/100)*10.5
ylist = (ylist/100)*6.5

ax1.scatter(xlist,ylist)

#int of the co-ordinates to populate the array
xlist_int = xlist.astype (int)
ylist_int = ylist.astype (int)

#print(xlist_int, ylist_int)

for i, j in zip(xlist_int, ylist_int):
    #this populates the array according to the x,y co-ordinate values it encounters 
    hmap[j][i]= hmap[j][i] + 1   

#Reversing the rows is necessary 
hmap = hmap[::-1]

#print(hmap)
im = ax2.imshow(hmap)

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

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