Hoe een histogram plotten met behulp van matplotlib in Python met een lijst met gegevens?

Ik probeer een histogram te plotten met behulp van de matplotlib.hist()functie, maar ik weet niet zeker hoe ik het moet doen.

Ik heb een lijst

probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]

en een lijst met namen (snaren).

Hoe maak ik de waarschijnlijkheid als mijn Y-waarde van elke bar en namen als X-waarden?


Antwoord 1, Autoriteit 100%

Als u een histogram wilt, hoeft u geen ‘namen’ aan x-waarden te hechten, zoals op x-as u gegevensbakken heeft:

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
np.random.seed(42)
x = np.random.normal(size=1000)
plt.hist(x, density=True, bins=30)  # density=False would make counts
plt.ylabel('Probability')
plt.xlabel('Data');

Opmerking, het nummer van bins=30werd willekeurig gekozen, en er is Freedman-DiConis Regel om meer wetenschappelijk te zijn bij het kiezen van de “RECHTER” BINBREEDTE:

, waarbij IQRInterkwartiel bereik en nis het totale aantal datapunten om

Dus, volgens deze regel kan men het aantal binsals:

berekenen

q25, q75 = np.percentile(x,[.25,.75])
bin_width = 2*(q75 - q25)*len(x)**(-1/3)
bins = round((x.max() - x.min())/bin_width)
print("Freedman–Diaconis number of bins:", bins)
plt.hist(x, bins = bins);

Freedman–Diaconis number of bins: 82

En tot slot kunt u uw histogram een ​​beetje fancier maken met PDFlijn, titels en legende:

import scipy.stats as st
plt.hist(x, density=True, bins=82, label="Data")
mn, mx = plt.xlim()
plt.xlim(mn, mx)
kde_xs = np.linspace(mn, mx, 300)
kde = st.gaussian_kde(x)
plt.plot(kde_xs, kde.pdf(kde_xs), label="PDF")
plt.legend(loc="upper left")
plt.ylabel('Probability')
plt.xlabel('Data')
plt.title("Histogram");

Als u echter een beperkt aantal gegevenspunten heeft, zoals in OP, zou een staafperceel logischer zijn om uw gegevens te vertegenwoordigen. Dan mag u labels bijvoegen aan x-as:

x = np.arange(3)
plt.bar(x, height=[1,2,3])
plt.xticks(x, ['a','b','c'])


Antwoord 2, autoriteit 11%

Als je matplotlib nog niet hebt geïnstalleerd, probeer dan gewoon de opdracht.

> pip install matplotlib

Bibliotheek importeren

import matplotlib.pyplot as plot

De histogramgegevens:

plot.hist(weightList,density=1, bins=20) 
plot.axis([50, 110, 0, 0.06]) 
#axis([xmin,xmax,ymin,ymax])
plot.xlabel('Weight')
plot.ylabel('Probability')

Histogram weergeven

plot.show()

En de uitvoer is als:


Antwoord 3, autoriteit 5%

Hoewel de vraag het plotten van een histogram lijkt te vereisen met de functie matplotlib.hist(), kan het aantoonbaar niet worden gedaan door hetzelfde te gebruiken als het laatste deel van de vraag vereist om de gegeven kansen te gebruiken als de y-waarden van maten en voornamen (strings) als de x-waarden.

Ik ga uit van een voorbeeldlijst met namen die overeenkomen met gegeven kansen om de plot te tekenen. Een eenvoudig staafdiagram dient hier het doel voor het gegeven probleem. De volgende code kan worden gebruikt:

import matplotlib.pyplot as plt
probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]
names = ['name1', 'name2', 'name3', 'name4', 'name5', 'name6', 'name7', 'name8', 'name9',
'name10', 'name11', 'name12', 'name13'] #sample names
plt.bar(names, probability)
plt.xticks(names)
plt.yticks(probability) #This may be included or excluded as per need
plt.xlabel('Names')
plt.ylabel('Probability')

Antwoord 4, autoriteit 2%

Dit is een oude vraag, maar geen van de eerdere antwoorden heeft het echte probleem aangepakt, d.w.z. het feit dat het probleem bij de vraag zelf ligt.

Ten eerste, als de waarschijnlijkheden al zijn berekend, dwz de histogram-geaggregeerde gegevens zijn op een genormaliseerde manier beschikbaar, dan zouden de kansen moeten optellen tot 1. Dat is duidelijk niet het geval en dat betekent dat hier iets mis is, hetzij met terminologie of met de gegevens of in de manier waarop de vraag wordt gesteld.

Ten tweede zou het feit dat de labels worden verstrekt (en geen intervallen) normaal gesproken betekenen dat de kansen van een categorische responsvariabele zijn – en het gebruik van een staafdiagram voor het plotten van het histogram is het beste (of het hacken van de hist van de pyplot methode), geeft het antwoord van Shayan Shafiq de code.

Zie echter probleem 1, die kansen zijn niet correct en het gebruik van staafdiagram in dit geval als “histogram” zou verkeerd zijn omdat het om de een of andere reden niet het verhaal van univariate distributie vertelt (misschien overlappen de klassen en observaties meerdere keren geteld?) en een dergelijke plot mag in dit geval geen histogram worden genoemd.

Histogram is per definitie een grafische weergave van de verdeling van univariate variabele (zie Histogram | NIST/SEMATECH e-Handbook of Statistical Methods& Histogram | Wikipedia ) en wordt gemaakt door staven van grootte te tekenen die tellingen of frequenties van waarnemingen in geselecteerde klassen van de variabele van belang vertegenwoordigen. Als de variabele op een continue schaal wordt gemeten, zijn die klassen bins (intervallen). Een belangrijk onderdeel van de procedure voor het maken van histogrammen is het maken van een keuze hoe de categorieën van antwoorden voor een categorische variabele moeten worden gegroepeerd (of behouden zonder te groeperen), of hoe het domein van mogelijke waarden in intervallen moet worden opgesplitst (waar de bin-grenzen moeten worden geplaatst) voor continu variabele typen. Alle waarnemingen moeten worden weergegeven, en elk slechts één keer in de plot. Dat betekent dat de som van de staafafmetingen gelijk moet zijn aan het totale aantal waarnemingen (of hun oppervlakten in het geval van de variabele breedten, wat een minder gebruikelijke benadering is). Of, als het histogram genormaliseerd is, dan moeten alle kansen optellen tot 1.

Als de gegevens zelf een lijst van “waarschijnlijkheden” als antwoord zijn, dwz de waarnemingen zijn waarschijnlijkheidswaarden (van iets) voor elk onderzoeksobject, dan is het beste antwoord gewoon plt.hist(probability)met misschien binning-optie, en het gebruik van x-labels die al beschikbaar zijn, is verdacht.

Dan moet de staafgrafiek niet als histogram worden gebruikt, maar gewoon

import matplotlib.pyplot as plt
probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]
plt.hist(probability)
plt.show()

met de resultaten

matplotlib komt in dat geval standaard aan met de volgende histogramwaarden

(array([1., 1., 1., 1., 1., 2., 0., 2., 0., 4.]),
 array([0.31308411, 0.32380469, 0.33452526, 0.34524584, 0.35596641,
        0.36668698, 0.37740756, 0.38812813, 0.39884871, 0.40956928,
        0.42028986]),
 <a list of 10 Patch objects>)

het resultaat is een tupel van arrays, de eerste array bevat waarnemingen, dat wil zeggen wat er op de y-as van de plot wordt weergegeven (ze tellen op tot 13, totaal aantal waarnemingen) en de tweede array is het interval grenzen voor x-as.

Men kan controleren of ze op gelijke afstand van elkaar staan,

x = plt.hist(probability)[1]
for left, right in zip(x[:-1], x[1:]):
  print(left, right, right-left)

Of, bijvoorbeeld voor 3 bakken (mijn oordeel roept op tot 13 waarnemingen) zou men dit histogram krijgen

plt.hist(probability, bins=3)

waarbij de plotgegevens “achter de tralies” zijn

De auteur van de vraag moet verduidelijken wat de betekenis is van de lijst met “waarschijnlijkheid” – is de “waarschijnlijkheid” slechts een naam van de responsvariabele (waarom zijn er dan x-labels klaar voor het histogram, het slaat nergens op), of zijn de lijstwaarden de waarschijnlijkheden die uit de gegevens zijn berekend (dan slaat het feit dat ze niet optellen tot 1 nergens op).


Antwoord 5, autoriteit 2%

Dit is een zeer omslachtige manier om het te doen, maar als u een histogram wilt maken waarvan u de bin-waarden al kent maar niet over de brongegevens beschikt, kunt u de np.random.randintfunctie om het juiste aantal waarden binnen het bereik van elke bin te genereren voor de hist-functie om een grafiek te maken, bijvoorbeeld:

import numpy as np
import matplotlib.pyplot as plt
data = [np.random.randint(0, 9, *desired y value*), np.random.randint(10, 19, *desired y value*), etc..]
plt.hist(data, histtype='stepfilled', bins=[0, 10, etc..])

wat betreft labels kun je x ticks uitlijnen met bins om zoiets als dit te krijgen:

#The following will align labels to the center of each bar with bin intervals of 10
plt.xticks([5, 15, etc.. ], ['Label 1', 'Label 2', etc.. ])

Other episodes