हिस्टोग्राम माथ्लोटलिब


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()

यहां छवि विवरण दर्ज करें


क्या बार के ग्राफ के एक्स-अक्ष में बिन किनारों को पास करने का एक तरीका है?
CMCDragonkai

@CMCDragonkai: plt.barका widthपैरामीटर एक सरणी जैसी ऑब्जेक्ट (स्केलर के बजाय) को स्वीकार कर सकता है। इसलिए आप width = np.diff(bins)इसके बजाय उपयोग कर सकते हैं width = 0.7 * (bins[1] - bins[0])
unutbu

लेकिन अपने आप widthसेटिंग केवल बार की चौड़ाई को सही करता है? मैं एक्स-एक्सिस लेबल के बारे में बात कर रहा हूं (यानी मैं वास्तविक एक्स किनारों को एक्स-एक्सिस पर लेबल होते हुए देखना चाहता हूं)। यह कैसे plt.histकाम करता है के समान होना चाहिए ।
CMCDragonkai

2
@CMCDragonkai: आप xlabels ax.set_xticksसेट करने के लिए उपयोग कर सकते हैं । मैंने ऊपर एक उदाहरण जोड़ा है कि मेरा क्या मतलब है।
unutbu

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प्लॉट किए जाने वाले डेटा को उत्पन्न करने के लिए मैं केवल numpy आयात करता हूं । यह फ़ंक्शन के histबजाय फ़ंक्शन पर निर्भर करता है barजैसे @unutbu द्वारा उत्तर में।

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संभवतः उनकी साइट के लिए एक लिंक और उदाहरण के माध्यम से एक और शामिल करना चाहिए जो बताता है कि क्या चल रहा है।
ताकसवेल

0

मुझे लगता है कि यह किसी के लिए उपयोगी हो सकता है।

Numpy का हिस्टोग्राम फ़ंक्शन, मेरी झुंझलाहट के लिए (हालांकि, मैं इसकी सराहना करता हूं कि इसके लिए एक अच्छा कारण है), बिन के मूल्य के बजाय प्रत्येक बिन के किनारों को वापस करता है। हालांकि, यह फ्लोटिंग-पॉइंट नंबरों के लिए समझ में आता है, जो एक अंतराल के भीतर झूठ हो सकता है (यानी केंद्र मूल्य सुपर सार्थक नहीं है), असतत मूल्यों या पूर्णांक (0, 1, 2, आदि) के साथ काम करते समय यह वांछित आउटपुट नहीं है। । विशेष रूप से, np.histogram से लौटे डिब्बे की लंबाई मायने नहीं रखती / घनत्व की लंबाई के बराबर है।

इसके चारों ओर पाने के लिए, मैंने इनपुट को निर्धारित करने के लिए np.digitize का उपयोग किया, और प्रत्येक बिन के लिए गिनती के अंश के साथ, डिब्बे की एक असतत संख्या लौटा दी। आप आसानी से संख्याओं की पूर्णांक संख्या प्राप्त करने के लिए संपादित कर सकते हैं।

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:

[१] https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html

[२] https://docs.scipy.org/doc/numpy/reference/generated/numpy.giz.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.