ম্যাটপ্ল্লোলিব সহ একক চার্টে দুটি হিস্টোগ্রাম প্লট করুন


233

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

n,bins,patchs = ax.hist(mydata1,100)
n,bins,patchs = ax.hist(mydata2,100)

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

উত্তর:


418

এখানে আপনার কাজের উদাহরণ রয়েছে:

import random
import numpy
from matplotlib import pyplot

x = [random.gauss(3,1) for _ in range(400)]
y = [random.gauss(4,2) for _ in range(400)]

bins = numpy.linspace(-10, 10, 100)

pyplot.hist(x, bins, alpha=0.5, label='x')
pyplot.hist(y, bins, alpha=0.5, label='y')
pyplot.legend(loc='upper right')
pyplot.show()

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


1
pyplot.hold(True)ঠিক কী ক্ষেত্রে প্লট করার আগে সেট করা ভাল ধারণা হবে না ?
জ্যাব

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

@ জোআকুইন: আমি কীভাবে এক্সকে নীল হতে এবং y টি লাল হতে পারি?
এএমসি

7
যখন আমি প্লটের বারের কিনারার দিয়ে পুনরুত্পাদন করি তখন Noneডিফল্ট হয়। যদি আপনি গ্রাফটিতে প্রদর্শিত একই নকশাটি চান তবে edgecolorউদাহরণস্বরূপ k(কালো) উভয় ক্ষেত্রে আপনি প্যারামিটার সেট করতে পারেন । পদ্ধতিটি কিংবদন্তির জন্য একই।
সুতরাং এস

2
আরও সহজ: pyplot.hist([x, y], bins, alpha=0.5, label=['x', 'y'])
আগস্টিন

174

গৃহীত উত্তরগুলি ওভারল্যাপিং বারগুলির সাথে একটি হিস্টোগ্রামের কোড দেয়, তবে আপনি যদি প্রতিটি বার পাশাপাশি থাকতে চান (যেমনটি আমি করেছি), নীচের প্রকরণটি চেষ্টা করুন:

import numpy as np
import matplotlib.pyplot as plt
plt.style.use('seaborn-deep')

x = np.random.normal(1, 2, 5000)
y = np.random.normal(-1, 3, 2000)
bins = np.linspace(-10, 10, 30)

plt.hist([x, y], bins, label=['x', 'y'])
plt.legend(loc='upper right')
plt.show()

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

রেফারেন্স: http://matplotlib.org/example/statistics/histogram_demo_mુટhist.html

সম্পাদনা [2018/03/16]: @ স্টোকাস্টিক_জেটজিস্টের পরামর্শ অনুসারে বিভিন্ন আকারের অ্যারে প্লট করার অনুমতি দেওয়ার জন্য আপডেট করা হয়েছে


@ গুস্তাভোবেজার, plt.histপ্রতিটি হিস্টোগ্রামের জন্য একটি পিডিএফ ফাইল তৈরি করতে কীভাবে ব্যবহার করবেন? আমি ব্যবহার করে আমার ডেটা লোড করেছি pandas.read_csvএবং ফাইলটিতে 36 টি কলাম এবং 100 টি লাইন রয়েছে। সুতরাং আমি 100 পিডিএফ ফাইল চাই।
সিগুর

2
@ সিগুর এটি সম্পূর্ণ বিষয় না। গুগল বা একটি নতুন প্রশ্ন জিজ্ঞাসা করুন। এটি সম্পর্কিত বলে মনে হচ্ছে: স্ট্যাকওভারফ্লো.com
গুস্তাভো বেজারেরা

1
@stochastic_zeitgeist আমি @ পাসবি এর সাথে একমত আমি আপনার মন্তব্যকে একটি পান্ডাস ডেটা ফ্রেমের সাথে ব্যবহার করেছি কারণ ন্যানদের কারণে আমার বিভিন্ন ওজনের প্রয়োজন। এর সাথে x=np.array(df.a)এবং y=np.array(df.b.dropna())এটি মূলত সত্তাplt.hist([x, y], weights=[np.ones_like(x)/len(x), np.ones_like(y)/len(y)])
গ্রিনসবেচেচেন

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

1
@ আগপেগাল'লো দয়া করে অ্যান্ড্রুয়ের উত্তরটি দেখুন।
গুস্তাভো বেজারেরা

30

ক্ষেত্রে আপনার বিভিন্ন নমুনা আকার আছে, একটি একক y- অক্ষের সাথে বিতরণ তুলনা করা কঠিন হতে পারে। উদাহরণ স্বরূপ:

import numpy as np
import matplotlib.pyplot as plt

#makes the data
y1 = np.random.normal(-2, 2, 1000)
y2 = np.random.normal(2, 2, 5000)
colors = ['b','g']

#plots the histogram
fig, ax1 = plt.subplots()
ax1.hist([y1,y2],color=colors)
ax1.set_xlim(-10,10)
ax1.set_ylabel("Count")
plt.tight_layout()
plt.show()

hist_single_ax

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

#sets up the axis and gets histogram data
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.hist([y1, y2], color=colors)
n, bins, patches = ax1.hist([y1,y2])
ax1.cla() #clear the axis

#plots the histogram data
width = (bins[1] - bins[0]) * 0.4
bins_shifted = bins + width
ax1.bar(bins[:-1], n[0], width, align='edge', color=colors[0])
ax2.bar(bins_shifted[:-1], n[1], width, align='edge', color=colors[1])

#finishes the plot
ax1.set_ylabel("Count", color=colors[0])
ax2.set_ylabel("Count", color=colors[1])
ax1.tick_params('y', colors=colors[0])
ax2.tick_params('y', colors=colors[1])
plt.tight_layout()
plt.show()

hist_twin_ax


1
এই আপনি ছাড়া একটা চমৎকার সংক্ষিপ্ত উত্তর প্রতিটি টিক লেবেলের উপর বার কেন্দ্রীভূত কিভাবে যোগ করা উচিত নয়
Odisseo

12

গুস্তাভো বেজারের উত্তরটির সমাপ্তি হিসাবে :

আপনি যদি প্রতিটি হিস্টোগ্রামকে স্বাভাবিক করতে চান ( normedএমপিএল <= 2.1 এবং densityএমপিএল> = 3.1 এর জন্য ) আপনি কেবল ব্যবহার করতে না পারেন normed/density=Trueতবে পরিবর্তে প্রতিটি মানের জন্য ওজন নির্ধারণ করতে হবে:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.normal(1, 2, 5000)
y = np.random.normal(-1, 3, 2000)
x_w = np.empty(x.shape)
x_w.fill(1/x.shape[0])
y_w = np.empty(y.shape)
y_w.fill(1/y.shape[0])
bins = np.linspace(-10, 10, 30)

plt.hist([x, y], bins, weights=[x_w, y_w], label=['x', 'y'])
plt.legend(loc='upper right')
plt.show()

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

একটি তুলনা হিসাবে, একই একই xএবং yডিফল্ট ওজন এবং density=True:

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


9

এর binsদ্বারা প্রদত্ত মানগুলি থেকে আপনার ব্যবহার করা উচিত hist:

import numpy as np
import matplotlib.pyplot as plt

foo = np.random.normal(loc=1, size=100) # a normal distribution
bar = np.random.normal(loc=-1, size=10000) # a normal distribution

_, bins, _ = plt.hist(foo, bins=50, range=[-6, 6], normed=True)
_ = plt.hist(bar, bins=bins, alpha=0.5, normed=True)

একই বেনিং সহ দুটি ম্যাটপ্ল্লোব হিস্টোগ্রাম


7

ডেটা বিভিন্ন আকারের হয় যখন একই প্লটে পাশাপাশি দুটি বারের সাথে দুটি হিস্টোগ্রাম প্লট করার জন্য একটি সহজ পদ্ধতি:

def plotHistogram(p, o):
    """
    p and o are iterables with the values you want to 
    plot the histogram of
    """
    plt.hist([p, o], color=['g','r'], alpha=0.8, bins=50)
    plt.show()

3

মনে হচ্ছে আপনি কেবল একটি বার গ্রাফ চাইবেন:

বিকল্পভাবে, আপনি সাবপ্লট ব্যবহার করতে পারেন।


পার্থক্য হিস্ট সহ আপনি একটি ফ্রিকোয়েন্সি প্লট পেতে পারেন। এটি আপনার কীভাবে করা উচিত তা দেখানো উচিত। পান্ডাস + বার প্লট = হিস্ট ()
ভিপি

2

আপনার কাছে পান্ডা ( import pandas as pd) থাকলে বা এটি ব্যবহারে ঠিক আছে:

test = pd.DataFrame([[random.gauss(3,1) for _ in range(400)], 
                     [random.gauss(4,2) for _ in range(400)]])
plt.hist(test.values.T)
plt.show()

আমি বিশ্বাস করি যে হস্টোগ্রামগুলির তুলনা করার জন্য বিভিন্ন নমুনার আকার থাকলে পান্ডা ব্যবহার করা কার্যকর হবে না। এটি প্রায়শই প্রসঙ্গ হয় যেখানে সাধারণত হিস্টোগ্রাম ব্যবহার করা হয়।
সলোমন ভিমাল

2

যখন আপনি 2-ডি নাম্পার অ্যারে থেকে হিস্টোগ্রাম প্লট করতে চান তখন একটি সতর্কতা রয়েছে। আপনার 2 অক্ষটি অদলবদল করা দরকার।

import numpy as np
import matplotlib.pyplot as plt

data = np.random.normal(size=(2, 300))
# swapped_data.shape == (300, 2)
swapped_data = np.swapaxes(x, axis1=0, axis2=1)
plt.hist(swapped_data, bins=30, label=['x', 'y'])
plt.legend()
plt.show()

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


0

এই প্রশ্নের উত্তর আগেই দেওয়া হয়েছে, তবে আরও একটি দ্রুত / সহজ কাজ যোগ করতে চেয়েছিলেন যা এই প্রশ্নে অন্যান্য দর্শকদের সহায়তা করতে পারে।

import seasborn as sns 
sns.kdeplot(mydata1)
sns.kdeplot(mydata2)

কেডি বনাম হিস্টোগ্রাম তুলনার জন্য কিছু সহায়ক উদাহরণ এখানে রয়েছে


0

সলোমন এর উত্তরে অনুপ্রাণিত, কিন্তু হিস্টোগ্রামের সাথে সম্পর্কিত এই প্রশ্নের সাথে লেগে থাকতে, একটি পরিষ্কার সমাধান হল:

sns.distplot(bar)
sns.distplot(foo)
plt.show()

প্রথমে লম্বাটিকে চক্রান্ত করার বিষয়টি নিশ্চিত করুন, অন্যথায় আপনাকে plt.ylim (0,0.45) সেট করতে হবে যাতে লম্বা হিস্টগ্রামটি কেটে না যায়।


0

এছাড়াও একটি বিকল্প যা জোয়াকুইন উত্তরের সাথে বেশ অনুরূপ:

import random
from matplotlib import pyplot

#random data
x = [random.gauss(3,1) for _ in range(400)]
y = [random.gauss(4,2) for _ in range(400)]

#plot both histograms(range from -10 to 10), bins set to 100
pyplot.hist([x,y], bins= 100, range=[-10,10], alpha=0.5, label=['x', 'y'])
#plot legend
pyplot.legend(loc='upper right')
#show it
pyplot.show()

নিম্নলিখিত আউটপুট দেয়:

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

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