Gnuplot'taki logaritmik ölçekte histogram

Her iki eksende logaritmik ölçekte bir histogramı gnuplot kullanarak çizmeliyim. Log10'da eşit aralıklarla yerleştirilecek kutulara ihtiyacım var. Y ekseninde bir logaritmik ölçek kullanmak bir problem değildir. Ana sorun, x eksenindeki bin yaratılmasıdır. Örneğin, log10'da 10 bidon kullanıldığında, ilk kutular [1], [2], [3] .... [10 - 19] [20 - 29] ..... [100 190] olacaktır. . İnternette aradım ama pratik bir çözüm bulamadım. Eğer gnuplot'ta bunu gerçekleştirmek çok karmaşıksa, bunu yapmak için başka bir yazılım/dil önerebilir misiniz?

Birisi sorduğumda, özellikle ne yapmam gerektiğini açıklayacağım. Bunun gibi bir (büyük) listem var:

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

Örneğin, 14 milyon IP adresinin 1 paket, 7 milyon paket 2 paket gönderdiğini gösterir. 1 ip adres 6600 paket gönderdi, ... 1 ip adres 19000 paket gönderdi. Gördüğünüz gibi, her iki eksende de değerler oldukça yüksektir, bu yüzden logaritmik bir ölçek olmadan çizemiyorum.

İlk denediğim şey, hızlı bir şekilde yapmam gerekti çünkü bu listeyi, her iki eksende gnuplot ayar logscale'i kutucukları kullanarak olduğu gibi çiziyordu. Sonuç anlaşılabilir ama çok uygun değil. Aslında, kutular x ekseni üzerinde gittikçe zayıflaşmaya başladılar çünkü açıkçası, 10-100'de 1-10'dan daha fazla puan var! Böylece ikinci onyıldan sonra gerçek bir karmaşa oldu.

3
Daha iyi bir anlayış için soruyu düzenledim. @Blender bu kütüphaneyle yapmanın mümkün olduğuna emin misin?
katma yazar markusian, kaynak
Az önce maplotlib kullanıyorum @Blender hakkında konuşuyordum ve tam olarak ihtiyacım olan şey buydu!
katma yazar markusian, kaynak
Python ile Matplotlib. Bu harika bir araç.
katma yazar Blender, kaynak
Bir histogramı logaritmik x ekseni ile çizmek istediğiniz veriye sahip misiniz? Belki başka bir yaklaşım ile verilerinizi çizmek için daha mantıklı !?
katma yazar Woltan, kaynak

3 cevap

Her iki eksende logaritmik olarak ölçeklendirilmiş bir histogram çizmeyi ve hata ile gnuplot yapmayı denedim

Log scale on X is incompatible with histogram plots.

Dolayısıyla gnuplot'un x ekseni üzerindeki histogramlarla bir log ölçeğini desteklemediği görülmektedir.

5
katma
Tamam, bu bilmek için önemli bir şey!
katma yazar markusian, kaynak
Bu kesinlikle doğru değil. GnuPlot, log-log arazilerini destekliyor. Log-log ölçeklemesini set logscale ile ayarlayabilir ve daha sonra dosyanızı plot "dosya.txt" w p komutuyla birlikte çizebilirsiniz. Varsayım, "file.txt" satır başına iki değere (x ve y) sahiptir ve bu dosyada x = 0 veya y = 0 olan hiçbir satır yoktur, çünkü logaritma orada tanımsızdır. Dahası, kutularla çizim yapmak daha da zorlayıcıdır. Sadece xrange'in [1: m] biçimindedir ve 1 ile m arasında x için tüm değerler verilir ve sıfır değildir. Aksi takdirde, 0 boyutundaki kutuların üretilmesi gerekir => Hata.
katma yazar MightyMouse, kaynak
Aşağıdaki örnek çözümüme bakın.
katma yazar MightyMouse, kaynak

GnuPlot'ta log-log ölçeğinde çizim yapmak, bu threaddaki diğer mesajın aksine mükemmel şekilde yapılabilir.

GnuPlot'ta günlük kaydı ölçeğini set logscale komutuyla ayarlayabilirsiniz. Daha sonra, varsayım, hem x ekseninde hem de y ekseninde pozitif (kesinlikle sıfır olmayan) değerlere sahip bir dosyaya sahip olduğumuzdur. Örneğin, aşağıdaki dosya geçerli bir dosyadır:

1 0.5
2 0.2
3 0.15
4 0.05

Log-log ölçeğini ayarladıktan sonra, dosyayı komutla çizebilirsiniz: çizim "file.txt" w p tabiki dosya.txt dosyasının adıdır. Bu komut, çıktıları noktalarla üretecektir.

Çizdirme kutularının da zor olduğunu ve muhtemelen tavsiye edilmediğini unutmayın. Birincisi, x-range'in set xrange [1: 4] komutunun bir komutu ile sınırlandırılması ve sadece kutularla çiziminin yapılması gerekir. Aksi takdirde, x aralığı tanımsız olduğunda bir hata döndürülür. Bu durumda arsada (uygun x değerleri için) bazı kutuların boyut kütüğüne (0) sahip olması gerektiği, ki bu da tabiki tanımlanmamış ve dolayısıyla hata döndürülmüştür.

Umarım net ve başkalarına da yardım eder.

4
katma

Matplotlib 'i Python ? Matplotlib gerçekten güzel bir çizim kütüphanesidir ve Python'un basit sözdizimi ile birlikte kullanıldığında, işleri kolayca kolayca çizebilirsiniz:

import matplotlib.pyplot as plot

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

# Rest of plotting code
1
katma
Bir yorum sayesinde matplotlib kullanmaya başladım ve tam olarak ihtiyacım olanı yaptı. Logaritmik kutulara sahip olmak için de logspace kullandım. Şimdi neyi anlamaya çalışıyorum norm = Hist işlevinin doğru çalışmıyor gibi görünmüyor.
katma yazar markusian, kaynak
Bu kafa karıştırıcı bir anahtar kelimedir ve bir sonraki önemli sürümde kaldırılır (matplotlib'in sayısal arka ucu). Dokümantasyon başka bir şey kullanmayı önerir: dokümanlar. scipy.org/doc/numpy/reference/generated/…
katma yazar Blender, kaynak