হিস্টোগ্রাম ম্যাটপ্ল্লিটিব


107

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

bins, n=hist()

তবে এটি পছন্দ হয়নি। কোন সুপারিশ?

উত্তর:


239
import matplotlib.pyplot as plt
import numpy as np

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
hist, bins = np.histogram(x, bins=50)
width = 0.7 * (bins[1] - bins[0])
center = (bins[:-1] + bins[1:]) / 2
plt.bar(center, hist, align='center', width=width)
plt.show()

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

অবজেক্ট-ওরিয়েন্টেড ইন্টারফেসও সোজা:

fig, ax = plt.subplots()
ax.bar(center, hist, align='center', width=width)
fig.savefig("1.png")

আপনি যদি কাস্টম (অ-ধ্রুবক) বিনগুলি ব্যবহার করছেন np.diff, আপনি বিনা প্রান্তগুলি ব্যবহার করে সংখ্যাগুলি পাস করতে পারেন, প্রস্থগুলিকে পাস করতে পারেন ax.barএবং ax.set_xticksবিন প্রান্তগুলি লেবেল করতে ব্যবহার করতে পারেন :

import matplotlib.pyplot as plt
import numpy as np

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
bins = [0, 40, 60, 75, 90, 110, 125, 140, 160, 200]
hist, bins = np.histogram(x, bins=bins)
width = np.diff(bins)
center = (bins[:-1] + bins[1:]) / 2

fig, ax = plt.subplots(figsize=(8,3))
ax.bar(center, hist, align='center', width=width)
ax.set_xticks(bins)
fig.savefig("/tmp/out.png")

plt.show()

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


বার গ্রাফের এক্স-অক্ষে বিন প্রান্তগুলি পাস করার কোনও উপায় আছে?
সিএমসিডিগ্রাগনকাই

@ সিএমসিডিগ্রাগনকাই: plt.barএর widthপ্যারামিটারগুলি অ্যারের মতো বস্তুটি (স্কেলারের পরিবর্তে) গ্রহণ করতে পারে। সুতরাং আপনি width = np.diff(bins)পরিবর্তে ব্যবহার করতে পারে width = 0.7 * (bins[1] - bins[0])
unutbu

কিন্তু widthসেটিংটি নিজেই কেবল বারটির প্রস্থকে ঠিক করে দেয়? আমি এক্স-অক্ষের লেবেলগুলির বিষয়ে কথা বলছি (এটি হ'ল আমি দেখতে চাই যে আসল বিন প্রান্তটি এক্স-অক্ষে লেবেলযুক্ত)। এটি কীভাবে plt.histকাজ করে তা সাদৃশ্য হওয়া উচিত ।
সিএমসিডিগ্রাগনকাই

2
@ সিএমসিডিগ্রাগনকাই: আপনি এক্সলেবেল ax.set_xticksসেট করতে ব্যবহার করতে পারেন । আমি কী বলতে চাইছি তা বোঝাতে আমি উপরে একটি উদাহরণ যুক্ত করেছি।
আনটবু

22

আপনি যদি বারগুলি না চান তবে আপনি এটির মতো প্লট করতে পারেন:

import numpy as np
import matplotlib.pyplot as plt

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)

bins, edges = np.histogram(x, 50, normed=1)
left,right = edges[:-1],edges[1:]
X = np.array([left,right]).T.flatten()
Y = np.array([bins,bins]).T.flatten()

plt.plot(X,Y)
plt.show()

বারলেখ


6
আপনি ব্যবহার করতে পারেন ax.step
টাকসওয়েল

12

আমি জানি এটি আপনার প্রশ্নের উত্তর দেয় না, তবে আমি হিস্টোগ্রামগুলিতে ম্যাটপ্ল্লিটিব সমাধানটি অনুসন্ধান করার সময় আমি সর্বদা এই পৃষ্ঠায় শেষ করি কারণ histogram_demoম্যাটপ্ল্লোলিব উদাহরণ গ্যালারী পৃষ্ঠা থেকে সরলটি সরানো হয়েছিল।

এখানে একটি সমাধান রয়েছে, যার numpyআমদানি করার দরকার নেই। প্লট করার জন্য ডেটা উত্পন্ন করার জন্য আমি কেবল নাম্পার আমদানি করি x। এটি @ ইউন্টবু দ্বারা উত্তর হিসাবে ফাংশনের histপরিবর্তে ফাংশনটির উপর নির্ভর করে ।bar

import numpy as np
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)

import matplotlib.pyplot as plt
plt.hist(x, bins=50)
plt.savefig('hist.png')

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

এছাড়াও চেক আউট matplotlib গ্যালারি এবং matplotlib উদাহরণ


"এখানে এমন একটি সমাধান রয়েছে, যার জন্য অলস প্রয়োজন হয় না" - কোডের প্রথম লাইনটি নমপি আমদানি করে :)
মার্টিন আর।

2
@ মার্টিন আর। এটি কেবল প্লট করার জন্য ডেটা উত্পন্ন করার জন্য। লাইন 4-6 দেখুন। নপীর কোনও ব্যবহার নেই।
tommy.carstensen

6

আপনি যদি ব্যবহার করতে ইচ্ছুক হন pandas:

pandas.DataFrame({'x':hist[1][1:],'y':hist[0]}).plot(x='x',kind='bar')

27
আপনি যদি ব্যবহারের পরামর্শ দিতে যাচ্ছেন তবে pandasসম্ভবত তাদের সাইটের একটি লিঙ্ক এবং আরও অনেক উদাহরণের মাধ্যমে অন্তর্ভুক্ত করা উচিত যা যা চলছে তা ব্যাখ্যা করে।
টাকসওয়েল 21

0

আমি মনে করি এটি কারও পক্ষে কার্যকর হতে পারে।

আমার বিরক্তির জন্য নম্পির হিস্টোগ্রাম ফাংশন (যদিও আমি প্রশংসা করি যে এর জন্য একটি ভাল কারণ রয়েছে), বিনের মানের পরিবর্তে প্রতিটি বিনের কিনারা ফিরিয়ে দেয়। যদিও এটি ভাসমান-পয়েন্ট সংখ্যার জন্য অর্থবোধ করে, যা একটি বিরতির মধ্যে থাকতে পারে (অর্থাত্ কেন্দ্রের মানটি অতি অর্থবহ নয়), বিচ্ছিন্ন মান বা পূর্ণসংখ্যার (0, 1, 2, ইত্যাদি) নিয়ে কাজ করার সময় এটি পছন্দসই আউটপুট নয়) । বিশেষত, এনপি এইচটিগ্রাম থেকে ফিরে আসা বিনের দৈর্ঘ্য গণনা / ঘনত্বের দৈর্ঘ্যের সমান নয়।

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

def compute_PMF(data)
    import numpy as np
    from collections import Counter
    _, bins = np.histogram(data, bins='auto', range=(data.min(), data.max()), density=False)
    h = Counter(np.digitize(data,bins) - 1)
    weights = np.asarray(list(h.values())) 
    weights = weights / weights.sum()
    values = np.asarray(list(h.keys()))
    return weights, values
####

refs:

[1] https://docs.scipy.org/doc/numpy/references/generated/numpy.histogram.html

[২] https://docs.scipy.org/doc/numpy/references/generated/numpy.digitize.html

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