Гистограмма в логарифмическом масштабе в gnuplot

#gnuplot #histogram #logarithm #bins

#gnuplot #гистограмма #логарифм #ячейки

Вопрос:

Я должен построить гистограмму в логарифмическом масштабе по обеим осям, используя gnuplot. Мне нужно, чтобы ячейки были равномерно распределены в log10. Использование логарифмического масштаба по оси y не является проблемой. Основная проблема заключается в создании ячейки по оси x. Например, при использовании 10 ячеек в log10 первые ячейки будут [1],[2],[3]….[10 — 19][20 — 29]…..[100 190] и так далее. Я искал в сети, но не смог найти никакого практического решения. Если реализация этого в gnuplot слишком сложна, не могли бы вы предложить какое-нибудь другое программное обеспечение / язык для этого?

Как кто-то спросил, я объясню более конкретно, что мне нужно сделать. У меня есть (огромный) список, подобный этому:

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

Это показывает, например, что 14 миллионов IP-адресов отправили 1 пакет, 7 миллионов 2 пакета …. 1 ip-адрес отправил 6600 пакетов, … , 1 ip-адрес отправил 19000 пакетов. Как вы можете видеть, значения по обеим осям довольно высоки, поэтому я не могу построить его без логарифмического масштаба.

Первое, что я попробовал, потому что мне нужно было сделать это быстро, это составить этот список таким, какой он есть, с помощью gnuplot, устанавливающего логарифмическую шкалу на обеих осях с помощью ящиков. Результат понятен, но не слишком уместен. Фактически, прямоугольники становились все более и более тонкими, двигаясь прямо по оси x, потому что, очевидно, в 10-100 точек больше, чем в 1-10! Так что после второго десятилетия это стало настоящим беспорядком.

Комментарии:

1. Matplotlib с Python. Это удивительный инструмент.

2. Какие данные у вас есть, что вы хотите построить гистограмму с логарифмической осью x? Может быть, другой подход имеет больше смысла для построения ваших данных !?

3. Я отредактировал вопрос для лучшего понимания. @Blender вы уверены, что это возможно сделать с помощью этой библиотеки?

4. Я только что использовал maplotlib, о котором говорил @Blender, и это именно то, что мне было нужно!

Ответ №1:

Я попытался построить гистограмму с логарифмическим масштабированием обеих осей и с ошибкой gnuplot

Log scale on X is incompatible with histogram plots .

Таким образом, похоже, что gnuplot не поддерживает логарифмическую шкалу по оси x с гистограммами.

Комментарии:

1. Хорошо, это важно знать!

2. Это, конечно, не так. GnuPlot поддерживает логарифмические графики. Вы можете настроить масштабирование журнала set logscale , а затем вы можете отобразить свой файл с данными с помощью команды plot "file.txt" w p . Предполагается, что «file.txt » имеет два значения в строке (x и y), и в этом файле нет строки, которая имеет x = 0 или y = 0, поскольку логарифм там не определен. Более того, построение графиков с помощью блоков еще сложнее. Это может работать, только если xrange имеет вид [1:m], и все значения для x между 1 и m заданы и не равны нулю. В противном случае должны быть сгенерированы поля размером 0 => Ошибка.

3. Смотрите мой пример решения ниже.

Ответ №2:

Построение графика в логарифмическом масштабе в GnuPlot вполне выполнимо, в отличие от другого сообщения в этой теме.

Можно задать логарифмический масштаб в GnuPlot с помощью команды set logscale . Тогда предполагается, что у нас есть файл с положительными (строго ненулевыми) значениями как по оси x, так и по оси y. Например, следующий файл является допустимым файлом:

 1 0.5
2 0.2
3 0.15
4 0.05
 

После установки логарифмического масштаба можно отобразить файл с помощью команды:
plot "file.txt" w p где, конечно file.txt это имя файла. Эта команда сгенерирует выходные данные с точками.

Также обратите внимание, что построение прямоугольников сложно и, вероятно, не рекомендуется. Сначала нужно ограничить диапазон x с помощью команды вида set xrange [1:4] и только затем отображать с помощью прямоугольников. В противном случае, когда диапазон x не определен, возвращается ошибка. Я предполагаю, что в этом случае для построения графика требуется (для соответствующих значений x), чтобы некоторые поля имели размер log (0), который, конечно, не определен, и, следовательно, возвращается ошибка.

Надеюсь, это понятно, и это также поможет другим.

Ответ №3:

Вы пробовали Matplotlib с Python? Matplotlib — действительно хорошая библиотека для построения графиков, и при использовании с простым синтаксисом Python вы можете довольно легко создавать графики:

 import matplotlib.pyplot as plot

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

# Rest of plotting code
 

Комментарии:

1. Благодаря комментарию я начал использовать matplotlib, и он делает именно то, что мне было нужно. Я также использовал logspace для логарифмических ячеек. Теперь я пытаюсь понять, почему normed=True функции hist, похоже, не работает.

2. Это запутанное ключевое слово, которое будет удалено в следующем крупном выпуске numpy (числовой сервер matplotlib). Документация предлагает использовать что-то еще: docs.scipy.org/doc/numpy/reference/generated /…