#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 /…