Гистограмма с числовой осью x в gnuplot?

У меня есть этот файл как data.dat:

Xstep Y1 Y2 Y3 Y4
332 1.22 0.00 0.00 1.43
336 5.95 12.03 6.11 10.41
340 81.05 81.82 81.92 81.05
394 11.76 6.16 10.46 5.87
398 0.00 0.00 1.51 1.25
1036 0.03 0.00 0.00 0.00

Я могу построить эти данные в виде гистограммы с помощью этого скрипта hist-v1.gplot (используя set style data histogram):

set xlabel "X values"
set ylabel "Occurence"
set style data histogram
set style histogram cluster gap 1
set style fill solid border -1
set term png
set output 'hist-v1.png'
set boxwidth 0.9
# attempt to set xtics so they are positioned numerically on x axis:
set xtics ("332" 332, "336" 336, "340" 340, "394" 394, "398" 398, "1036" 1036)  
# ti col reads the first entry of the column, uses it as title name 
plot 'data.dat' using 2:xtic(1) ti col,  '' u 3 ti col, '' u 4 ti col, '' u 5 ti col

И позвонив:

gnuplot hist-v1.gplot && eog hist-v1.png

создается это изображение: изображение hist-v1.png

Однако вы можете заметить, что ось X не имеет числового масштаба — она понимает значения X как категории (т. е. это ось категорий).

Я могу получить более числовую ось X с помощью следующего скрипта hist-v2.gplot (используя with boxes):

set xlabel "X values"
set ylabel "Occurence"
# in this case, histogram commands have no effect
set style data histogram
set style histogram cluster gap 1
set style fill solid border -1
set term png
set output 'hist-v2.png'
set boxwidth 0.9
set xr [330:400]
# here, setting xtics makes them positioned numerically on x axis:
set xtics ("332" 332, "336" 336, "340" 340, "394" 394, "398" 398, "1036" 1036)  
# 1:2 will ONLY work with proper xr; since we have x>300; xr[0:10] generates "points y value undefined"!
plot 'data.dat' using 1:2 ti col smooth frequency with boxes, '' u 1:3 ti col smooth frequency with boxes

И позвонив:

gnuplot hist-v2.gplot && eog hist-v2.png

генерируется это изображение: http://img266.imageshack.us/img266/6717/histv2.png

К сожалению, столбцы здесь «перекрываются», поэтому график трудно прочитать.

Есть ли способ сохранить ось X числовой шкалы, как в hist-v2.png, но оставить «полосы» рядом с hist-v1.png? Эта ветка, "Re: Гистограмма с ошибкой даты по оси X" говорит, что вы не можете:

А вот вытащить из файла данных дату x-координаты будет тяжело,...

но тогда речь идет о другой проблеме...

Спасибо,

Ваше здоровье!


person sdaau    schedule 07.08.2010    source источник


Ответы (2)


Хорошо, после небольшого чтения справки gnuplot кажется, что стиль гистограммы «всегда» будет интерпретировать ось x как последовательные записи/категории, так что действительно, похоже, нет способа получить числовую ось со стилем гистограммы.

Однако оказывается, что $ может ссылаться на столбец, и их можно использовать для фактического «перемещения» столбцов во втором примере (стиль frequency with boxes); поэтому с этим кодом как hist-v2b.gplot:

set xlabel "X values"
set ylabel "Occurence"
set style fill solid border -1
set term png
set output 'hist-v2.png'
set boxwidth 0.9
set xr [330:400]
# here, setting xtics makes them positioned numerically on x axis:
set xtics ("332" 332, "336" 336, "340" 340, "394" 394, "398" 398, "1036" 1036)  
# 1:2 will ONLY work with proper xr; since we have x>300; xr[0:10] generates "points y value undefined"!
plot 'data.dat' using ($1-0.5):2 ti col smooth frequency with boxes, '' u ($1-0.25):3 ti col smooth frequency with boxes, '' u ($1+0.25):4 ti col smooth frequency with boxes, '' u ($1+0.5):5 ti col smooth frequency with boxes

И позвонив:

gnuplot hist-v2b.gplot && eog hist-v2b.png

генерируется это изображение: http://img823.imageshack.us/img823/805/histv2b.png

... что в значительной степени то, что я хотел в первую очередь.

Небольшое замечание — изначально я хотел использовать скрипт со встроенными данными; для такой установки это должно быть написано как

plot '-' using ($1-0.5):2 ti col smooth frequency with boxes, '-' u ($1-0.25):3 ti col smooth frequency with boxes
Xstep Y1 Y2 Y3 Y4
332 1.22 0.00 0.00 1.43
336 5.95 12.03 6.11 10.41
340 81.05 81.82 81.92 81.05
394 11.76 6.16 10.46 5.87
398 0.00 0.00 1.51 1.25
1036 0.03 0.00 0.00 0.00
end
Xstep Y1 Y2 Y3 Y4
332 1.22 0.00 0.00 1.43
336 5.95 12.03 6.11 10.41
340 81.05 81.82 81.92 81.05
394 11.76 6.16 10.46 5.87
398 0.00 0.00 1.51 1.25
1036 0.03 0.00 0.00 0.00
end

... то есть данные нужно было бы вводить несколько раз, так как они поступают со стандартного ввода - эта проблема обсуждается в gnuplot - создание нескольких графиков из файла данных с помощью встроенных команд .

Ваше здоровье!

PS: Поскольку на диаграмме довольно много места, было бы неплохо, если бы мы могли как-то указать отдельные диапазоны по оси X; что обсуждается в:

person sdaau    schedule 07.08.2010

Правильная установка ширины поля очень важна при построении гистограммы с использованием стиля графика «ящики». В одной из своих статей в блоге я рассказывал об этом. Если есть интерес, нажмите здесь!

введите здесь описание изображения

person hsxz    schedule 17.09.2011