2014-03-25 3 views
3

Я не увенчался успехом у других, используя график предыстории. Простой задача будет использовать следующие данные:Как создать гистограмму с различной шириной бункера

age range - frequency - central band width - bin width - height (respectively) 
1-4 - 30  -  2.5  -   3 - 10 
5-6 - 20  -  5.5  -  1 - 20 
7-17 - 30  -  12  -   10 - 3 

С возрастом вдоль оси X, с линейной шкалой, так что ширина бин для 1-4 будет 3, с высотой 10, шириной бин в течение 5 -6 будет 1 с высотой 20, а 7-17 - 10, а высота - 3.

Как разместить эти данные в документе Word/Notepad .dat? И как я могу использовать их для настройки гистограммы в gnuplot?

ответ

5

Я хотел бы использовать следующий формат файл данных (используйте только белые пробела для разделения полей):

"age range" "frequency" "central band width" "bin width" "height" 
1-4   30   2.5     3   10 
5-6   20   5.5     1   20 
7-17  30   12     10   3 
  • Для построения графика с переменной шириной рамкой, использовать стиль boxes построения графиков. Это позволяет использовать значение из столбца как ширину.
  • С помощью xtic(1) вы используете запись в первом столбце как xticlabel.

Так довольно простая зарисовка сценарий выглядит следующим образом:

set style fill solid noborder 
set yrange [0:*] 
set offset 1,1,1,0 
plot 'file.txt' using 3:5:4:xtic(1) with boxes notitle 

В результате с версией 4.6.3 и pngcairo терминалом:

enter image description here

0

мне удалось довольно хорошо пример блоков ширины переменной прошлой ночью. Я собирал данные гистограммы задержки, полученные в тестовом пакете производительности хранилища FIO. С моей опции компиляции У меня есть 1856 бункеров, которые идут следующим образом:

  • 1 нс шириной от 0-128 нс (128 бункеров)
  • 2 нс шириной от 128-256 нс (64 бункеров)
  • 4 нс шириной от 256-512 нс (64 бункеров)
  • 8 нс шириной от 512-1024 нс (64 бункеров)

  • и т.д. ...

Мои значения задержки во время графика находятся в микросекундах (FIO обеспечивает наносекунды, но мне нужны микросекунды по историческим причинам). У меня не было возможности включить ширину бункера в мои данные. Так что я сделал это:

  • е (х) = (2 ** (интермедиат (журнал (х * 1000)/журнал (2)) - 6))/1100
  • участок "Темп" у 1 : 2: (е (колонка (1))) с коробками фс прозрачной твердым телом 0.7 Названия noborder «$ легенды» $ base_plot

Диафрагменного (х) определение возвращает ширину окна для заданной задержки - она ​​работает как следует:

  1. Во-первых, x * 1000 возвращает меня к наносекундам.
  2. log (x * 1000)/log (2) принимает логарифм базы 2 наномсекундного счета.
  3. int() просто дает мне целую часть этого. Обратите внимание, что теперь, скажем, 128 нс, у меня было бы 7.
  4. -6 достает меня в базу 2 журнала ширины бункера.
  5. 2 ** возвращает меня к ширине бункера.
  6. /1000 возвращает меня от наносекунд до микросекунд.

Тогда я просто использую f (латентность) в команде plot в качестве ширины окна.

Это работает - кажется, работает отлично, насколько я могу судить. Это не дало бы правильного результата для x < 64 нс, но у меня нет данных, которые малы, так что это получается. Для его исправления для этой части диапазона можно использовать условное выражение.

Я думаю, что основные наблюдения здесь состоят в том, что: a) вам не нужно иметь ширину в виде литеральных данных - если вы можете рассчитать ее из данных, которые у вас есть, вы золотые, а b) столбец (n) является альтернативой $ n как способ выражения значений столбца в команде plot. В моем случае у меня есть все это в сценарии bash, и bash перехватил $ 1.

Смежные вопросы