Histogram op logaritmische schaal in gnuplot

Ik moet een histogram plotten op logaritmische schaal op beide assen met gnuplot. Ik heb bins nodig om op gelijke afstand van elkaar te staan ​​in log10. Het gebruik van een logaritmische schaal op de y-as is geen probleem. Het grootste probleem is het maken van de prullenbak op de x-as. Als u bijvoorbeeld 10 bins in log10 gebruikt, zijn de eerste bins [1], [2], [3] .... [10 - 19] [20 - 29] ..... [100 190] enzovoort . Ik heb op het net gezocht maar ik kon geen praktische oplossing vinden. Als het realiseren in gnuplot te gecompliceerd is, kun je een andere software/taal voorstellen om het te doen?

Zoals iemand vroeg, zal ik meer specifiek uitleggen wat ik moet doen. Ik heb een (enorme) lijst zoals deze:

1   14000000
2   7000000
3   6500000
.
.
.
.
6600    1
8900    1
15000   1
19000   1

Het laat bijvoorbeeld zien dat 14 miljoen IP-adressen 1 pakket, 7 miljoen 2 pakketten hebben verzonden .... 1 ip-adres 6600 pakketten verzonden, ..., 1 ip-adres 19000-pakketten verzonden. Zoals je kunt zien zijn de waarden op beide assen behoorlijk hoog, dus ik kan het niet plotten zonder een logaritmische schaal.

De eerste dingen die ik probeerde omdat ik het snel moest doen, was het plotten van deze lijst zoals het is met het instellen van de logschaal van gnuplot op beide assen met behulp van boxen. Het resultaat is begrijpelijk, maar niet te gepast. Sterker nog, de vakken werden steeds dunner en gingen recht op de x-as omdat er uiteraard meer punten zijn in 10-100 dan in 1-10! Dus het werd een echte puinhoop na het tweede decennium.

3
Ik heb de vraag bewerkt voor een beter begrip. @Blender weet u zeker dat het mogelijk is om het met die bibliotheek te doen?
toegevoegd de auteur markusian, de bron
Ik heb zojuist de maplotlib gebruikt waarover @Blender het had en het is precies wat ik nodig had!
toegevoegd de auteur markusian, de bron
Matplotlib met Python. Het is een geweldige tool.
toegevoegd de auteur Blender, de bron
Wat voor soort gegevens heb je dat je een histogram wilt plotten met een logaritmische x-as? Misschien is een andere aanpak logischer om uw gegevens te plotten met !?
toegevoegd de auteur Woltan, de bron

3 antwoord

Ik heb geprobeerd een histogram te plotten waarbij beide assen logaritmisch werden geschaald en gnuplot door de fout

Log scale on X is incompatible with histogram plots.

Dus lijkt het erop dat gnuplot geen logschaal op de x-as ondersteunt met histogrammen.

5
toegevoegd
Ok, dat is belangrijk om te weten!
toegevoegd de auteur markusian, de bron
Dit is zeker niet waar. GnuPlot ondersteunt log-log-plots. U kunt de log-logschaling instellen via logschaal instellen en dan kunt u uw bestand plotten met de gegevens met de opdracht plot "file.txt" w p . De aanname is dat "file.txt" twee waarden per regel (x en y) heeft, en er is geen regel in dat bestand die x = 0 of y = 0 heeft, omdat de logaritme daar niet gedefinieerd is. Bovendien is het plotten met dozen zelfs lastiger. Het werkt alleen als de xrange de vorm [1: m] heeft, en alle waarden voor x tussen 1 en m worden gegeven en zijn niet nul. Anders moeten boxen met de grootte 0 worden gegenereerd => Fout.
toegevoegd de auteur MightyMouse, de bron
Zie mijn voorbeeld-oplossing hieronder.
toegevoegd de auteur MightyMouse, de bron

Het plotten in log-log-schaal in GnuPlot is perfect uitvoerbaar in tegenstelling tot het andere bericht in deze thread.

Men kan de log-logschaal in GnuPlot instellen met de opdracht logschaal instellen . Vervolgens is de aanname dat we een bestand hebben met positieve (strikt niet-nul) waarden zowel op de x-as als op de y-as. Het volgende bestand is bijvoorbeeld een geldig bestand:

1 0.5
2 0.2
3 0.15
4 0.05

Na het instellen van de log-logschaal kan men het bestand plotten met de opdracht: plot "file.txt" w p waar natuurlijk file.txt de naam van het bestand is. Deze opdracht genereert de uitvoer met punten.

Merk ook op dat het plotten van vakjes lastig is en waarschijnlijk niet wordt aanbevolen. Eerst moet het x-bereik worden beperkt met een opdracht van het formulier xrange [1: 4] en pas dan plotten met vakken. Anders wordt er een fout geretourneerd wanneer het x-bereik niet is gedefinieerd. Ik veronderstel dat in dit geval de plot vereist (voor geschikte x-waarden) dat sommige boxen size log (0) hebben, wat natuurlijk ongedefinieerd is en daarom wordt de fout geretourneerd.

Ik hoop dat het duidelijk is en het zal ook anderen helpen.

4
toegevoegd

Heeft u Matplotlib geprobeerd met Python ? Matplotlib is een erg leuke plotbibliotheek en wanneer je hem gebruikt met de eenvoudige syntaxis van Python, kun je dingen gemakkelijk plotten:

import matplotlib.pyplot as plot

figure = plot.figure()
axis = figure.add_subplot(1 ,1, 1)
axis.set_yscale('log')

# Rest of plotting code
1
toegevoegd
Dankzij een opmerking begon ik met het gebruik van matplotlib en het doet precies wat ik nodig had. Ik heb ook logspace gebruikt om logaritmische opslaglocaties te hebben. Nu probeer ik te begrijpen waarom normed = True van de hist-functie niet lijkt te werken.
toegevoegd de auteur markusian, de bron
Het is een verwarrend zoekwoord en wordt verwijderd in de volgende belangrijke release van numpy (de numerieke backend van matplotlib). De documentatie suggereert om iets anders te gebruiken: docs. scipy.org/doc/numpy/reference/generated/…
toegevoegd de auteur Blender, de bron