আমি কীভাবে কোনও হিস্টোগ্রাম প্লট করতে পারি যে বারের উচ্চতাগুলি ম্যাটপ্ল্লোলিবতে 1 এর সমষ্টি হয়?


86

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

plt.hist(myarray, normed=True)

পাশাপাশি:

plt.hist(myarray, normed=1)

তবে কোনও বিকল্পই [0, 1] থেকে y-axis তৈরি করে না যেমন হিস্টগ্রামের বারের উচ্চতা 1 সমান হয় I'd


6
আমি জানি এটি পুরানো, তবে ভবিষ্যতের রেফারেন্সের জন্য এবং যে কেউ এই পৃষ্ঠাটিতে যান, এই ধরণের অক্ষ ছড়ানোর জন্য তাকে "সম্ভাব্যতা ঘনত্ব" অক্ষ বলা হয়!
ক্রিস্টিনবি

উত্তর:


50

আপনি যদি আরও সম্পূর্ণ পরিশ্রমের (বা এই ক্ষেত্রে অ-কর্মক্ষম) উদাহরণ রাখেন তবে এটি আরও সহায়ক হবে।

আমি নিম্নলিখিত চেষ্টা করেছিলাম:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.randn(1000)

fig = plt.figure()
ax = fig.add_subplot(111)
n, bins, rectangles = ax.hist(x, 50, density=True)
fig.canvas.draw()
plt.show()

এটি প্রকৃতপক্ষে একটি y- অক্ষ সহ একটি বার-চার্ট হিস্টোগ্রাম তৈরি করবে [0,1]

আরও, histডকুমেন্টেশন অনুযায়ী (যেমন ax.hist?থেকে ipython), আমি মনে করি যোগফলটিও ঠিক আছে:

*normed*:
If *True*, the first element of the return tuple will
be the counts normalized to form a probability density, i.e.,
``n/(len(x)*dbin)``.  In a probability density, the integral of
the histogram should be 1; you can verify that with a
trapezoidal integration of the probability density function::

    pdf, bins, patches = ax.hist(...)
    print np.sum(pdf * np.diff(bins))

উপরের আদেশগুলি পরে এটি চেষ্টা করে দেখুন:

np.sum(n * np.diff(bins))

আমি 1.0প্রত্যাশিত হিসাবে একটি রিটার্ন মান পেতে । মনে রাখবেন যে এর normed=Trueঅর্থ এই নয় যে প্রতিটি বারের মানটির যোগফল একতাবদ্ধ হয়, তবে বারগুলির চেয়ে বেশি অবিচ্ছেদ্য হয় unityক্য। আমার ক্ষেত্রে np.sum(n)প্রায় ফিরে এসেছিল 7.2767


4
হ্যাঁ, এটি একটি সম্ভাবনার ঘনত্বের গ্রাফ, আমি মনে করি তিনি একটি সম্ভাবনা ভর গ্রাফ চান।
NoName

201

আপনি যদি সমস্ত বারের যোগফলকে সমান unityক্যবদ্ধ করতে চান তবে প্রতিটি বিনের মোট মানের সংখ্যার দ্বারা ওজন করুন:

weights = np.ones_like(myarray) / len(myarray)
plt.hist(myarray, weights=weights)

আশা করি এটি সহায়তা করে, যদিও থ্রেডটি বেশ পুরানো ...

পাইথন ২.x এর জন্য নোট: float()বিভাগের অপারেটরগুলির মধ্যে একটিতে কাস্টিং যুক্ত করুন অন্যথায় আপনি পূর্ণসংখ্যা বিভাগের কারণে জিরো দিয়ে শেষ করবেন


8
দুর্দান্ত উত্তর। মনে রাখবেন যে মায়ারি যদি array_likeএকটি অদ্ভুত অ্যারের পরিবর্তে অজগর হয় তবে আপনাকে কাস্ট len(myarray)করতে হবে float
সেমিঃ

4
এছাড়াও যদি ম্যারিআর বহুমাত্রিক হয় এবং আপনি কেবলমাত্র একটি মাত্রা ব্যবহার করেন যেমন ম্যারিআর [0 ,:], তবে আপনি এনপি.সাইজ (মায়ার্য [0 ,:]) দিয়ে লেন (মায়ার্রে) পরিবর্তন করতে পারেন এবং এটি কাজ করবে একই ভাবে. (অন্যথায়, এটি বলে যে বস্তুটি কলযোগ্য নয়))
ক্রিস্টিনবি

22

আমি জানি এই উত্তরটি ২০১০ সালের তারিখের প্রশ্নটি বিবেচনা করে খুব দেরিতে হয়েছে তবে আমি নিজেই একই সমস্যার মুখোমুখি হওয়ায় আমি এই প্রশ্নটি পেরিয়ে এসেছি। ইতিমধ্যে উত্তরে বলা হয়েছে, আদর্শ = সত্য অর্থ হিস্টোগ্রামের অধীনে মোট ক্ষেত্রফল 1 এর সমান তবে উচ্চতার যোগফল 1 এর সমান নয় তবে যাইহোক, আমি হিস্টোগ্রামের শারীরিক ব্যাখ্যার সুবিধার্থে একটি তৈরি করতে চেয়েছিলাম সমান উচ্চতার সমষ্টি 1

আমি নীচের প্রশ্নে একটি ইঙ্গিত পেয়েছি - পাইথন: হিস্টগ্রাম সহ অঞ্চলটি 1 ব্যতীত অন্য কিছুতে সাধারণ হয়েছে

তবে আমি হস্ট টাইপ = "পদক্ষেপ" বৈশিষ্ট্য হিস্ট () নকল করে বারগুলি তৈরির উপায় খুঁজে পাইনি। এটি আমাকে ডাইভার্ট করেছিল: ম্যাটপ্ল্লোব - ইতিমধ্যে বিন্যাসিত ডেটা সহ স্টেপড হিস্টোগ্রাম

যদি সম্প্রদায়টি এটি গ্রহণযোগ্য মনে করে তবে আমার উচিত এমন একটি সমাধান উত্সাহ দেওয়া উচিত যা উপরের উভয় পোস্ট থেকে ধারণা সংশ্লেষ করে।

import matplotlib.pyplot as plt

# Let X be the array whose histogram needs to be plotted.
nx, xbins, ptchs = plt.hist(X, bins=20)
plt.clf() # Get rid of this histogram since not the one we want.

nx_frac = nx/float(len(nx)) # Each bin divided by total number of objects.
width = xbins[1] - xbins[0] # Width of each bin.
x = np.ravel(zip(xbins[:-1], xbins[:-1]+width))
y = np.ravel(zip(nx_frac,nx_frac))

plt.plot(x,y,linestyle="dashed",label="MyLabel")
#... Further formatting.

এটি আমার জন্য আশ্চর্যজনকভাবে কাজ করেছে যদিও কিছু ক্ষেত্রে আমি লক্ষ্য করেছি যে হিস্টোগ্রামের বাম সর্বাধিক "বার" বা ডান সর্বাধিক "বার" ওয়াই-অক্ষের সর্বনিম্ন বিন্দুকে স্পর্শ করে বন্ধ হয় না। এই ক্ষেত্রে ভিক্ষা বা y এর শেষে 0 টি উপাদান যুক্ত করা প্রয়োজনীয় ফলাফল অর্জন করে।

ভেবেছিলাম আমি আমার অভিজ্ঞতা শেয়ার করব। ধন্যবাদ.


আমার মনে হয় আপনার আদর্শ প্রয়োজন = plt.hist এও সত্য। পাইথন 3 এ আপনাকে তালিকা (জিপ (...)) ব্যবহার করতে হবে।
সেবাস্তিয়ান স্মিটজ

11

np.histogram()পদ্ধতিটি ব্যবহার করে এখানে আরও একটি সহজ সমাধান ।

myarray = np.random.random(100)
results, edges = np.histogram(myarray, normed=True)
binWidth = edges[1] - edges[0]
plt.bar(edges[:-1], results*binWidth, binWidth)

আপনি দেখতে পারেন যে এর সাথে মোট যোগফল 1 টি সহ:

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