Я не могу понять, как построить несколько кривых, которые начинаются и заканчиваются после каждой последовательности. Мои последовательности повторяются «N» раз (много) от 1 до 5. Я хочу построить столбец2 по сравнению с столбцом3 и иметь другую кривую каждый раз, когда столбец1 (используя его как тернарный оператор) переходит от 1 до 5.
В примере должен получиться график с двумя кривыми. Последовательность сама по себе является переменной, это не постоянное количество точек.
for example:
column1 column2 column3
1 1 2 4
2 1 3 6
3 1 5 7
4 1 9 0
5 2 5 7
6 2 8 9
7 3 9 6
8 4 4 3
9 4 2 4
10 4 6 9
11 4 0 0
12 5 7 0
13 5 6 8
14 1 5 2
15 2 3 5
16 3 6 7
17 4 8 3
18 4 2 1
19 4 2 6
20 5 8 9
Линейные точки были бы лучшими, но с точками тоже очень хорошо. Цвет не важен, ключ не нужен.
@theozh в порыве гнева я отменил код и попытался решить проблему с python (pandas), используя старый вопрос, который я задал здесь, в stackoverflow. Теоретически это работает, но мне нужно перейти с .xlsx на .txt и изменить другие факторы, и мне было интересно, смогу ли я сделать это напрямую с помощью gnuplot.
ладно, злиться нехорошо. Просто опишите, что у вас есть, что вы хотите и что вы пробовали. Пожалуйста, всегда включайте некоторые минимизированные (но не неполные, как вы сделали сейчас) примеры данных. Какой стиль рисования вы хотите, with lines
или with points
или что-то еще...? Какие цвета вы хотите? Пожалуйста, включите такие детали.
Есть несколько деталей, неясных и отсутствующих в вашем описании, поэтому я сделаю предположения.
в принципе, вы можете построить свои разделенные данные every ::0::12
и every ::13::19
(индекс строки отсчитывается от нуля), но я предполагаю, что количество строк будет переменным и разным для каждого файла данных.
вы хотите построить столбец2 и столбец3 по сравнению с столбцом1 (но, может быть, вы хотите построить столбец2 по сравнению с столбцом3)? Я предполагаю первое.
вы хотите построить with points
. Напротив, with lines
станет более сложным, потому что ваши данные не содержат разрывов после того, как столбец 1 переходит от 5
обратно к 1
.
вы не указали, увеличивается ли ваш столбец 1 с 1
до 5
только в два раза или, может быть, в N
раз?
Как правило, часто вы можете адаптировать свои данные, чтобы команды построения графика были проще, или в случае, если вы не можете или не хотите изменять исходные данные, команды построения графика могут немного усложниться.
Хорошо, в качестве отправной точки для дальнейшей проверки следующий пример (с некоторыми завершенными тестовыми данными):
Скрипт:
### break data into subsets
reset session
$Data <<EOD
1 11.0 21.0
1 11.3 21.3
1 11.6 21.6
1 11.9 21.9
2 12.0 22.0
2 12.5 22.5
3 13.0 23.0
4 14.0 24.0
4 14.3 24.3
4 14.6 24.6
4 14.9 24.9
5 15.0 25.0
5 15.5 25.5
1 16.0 26.0
2 17.0 27.0
3 18.0 28.0
4 19.0 29.0
4 19.4 29.4
4 19.8 29.8
5 20.0 30.0
EOD
set key out reverse Left noautotitle
myColors = "0xff0000 0x00ff00 0x0000ff 0xff00ff"
myColor(col) = (t0=t1, t1=column(col), t1<t0 ? c=c+1 : 0, int(word(myColors,c)))
myTitles = '"column2, 1st" "column2, 2nd" "column3, 1st" "column3, 2nd"'
plot t1=(c=1,NaN) $Data u 1:2:(myColor(1)) w p pt 7 lc rgb var, \
t1=(c=3,NaN) '' u 1:3:(myColor(1)) w p pt 7 lc rgb var, \
for [i=1:4] keyentry w p pt 7 lc rgb int(word(myColors,i)) ti word(myTitles,i)
### end of script
Результат:
Добавление:
Еще одно испытание. Я не знаю, соответствуют ли предоставленные вами данные чему-то реалистичному. Если вы рисуете такие случайные данные, почему вы хотите разделить их на разные кривые даже одного цвета?
В любом случае, вот предложение для прерывания кривой из непрерывных данных (здесь дополнительно продолжается другим цветом).
«Хитрость» заключается в том, чтобы проверить, меньше ли текущее значение в столбце 1, чем предыдущее значение. Если это так, измените цвет линии на прозрачный (например, 0xff123456
), в противном случае выполните цикл между тремя цветами RGB (или выберите постоянный цвет).
«Трюк» с прозрачной линией имеет тот недостаток, что первая точка данных на графике точек линии будет пропускать свою точку (при необходимости ее можно добавить отдельно).
Другой вариант — ввести пустую строку после каждой последовательности в столбце 1 (от 1 до 5). Но я предполагаю, что вы не хотите изменять свой файл данных размером 200 МБ.
Посмотрите на пример ниже, но вполне может быть, что я до сих пор не до конца понял, чего вы на самом деле хотите.
Скрипт:
### break data into several curves
reset session
$Data <<EOD
column1 column2 column3
1 2 4
1 3 6
1 5 7
1 9 0
2 5 7
2 8 9
3 9 6
4 4 3
4 2 4
4 6 9
4 0 0
5 7 0
5 6 8
1 5 2
2 3 5
3 6 7
4 8 3
4 2 1
4 2 6
5 8 9
1 1 2 # some more data added for illustration
2 3 8
3 1 7
EOD
myColors = "0xff0000 0x00ff00 0x0000ff"
myColor(col) = (t0=t1, t1=column(col), t1<t0 ? (c=c+1, 0xff123456) : int(word(myColors,c%3+1)))
set key noautotitle
plot t1=(c=0,NaN) $Data u 2:3:(myColor(1)) w lp pt 7 lc rgb var
### end of script
Результат:
Большое спасибо, постараюсь быть точнее. 1. ваша презумпция верна; 2. Я хочу построить график столбца 2 и столбца 3, используя столбец 1 в качестве тернарного оператора; 3. У меня была такая же проблема, и я подумал, что с точками вместо линий будет проще сделать (я хотел бы знать, как это сделать с линиями, если это не слишком сложно, но не нужно); 4. столбец1 увеличивается от 1 до 5 N раз (это очень большие данные >200Мб). Спасибо за терпение.
@fae хорошо, пожалуйста, предоставьте разумные полные минимальные данные. Таким образом, столбец 2 равен x и постоянно увеличивается, а столбец 3 равен y. А в столбце1 определенное число может повторяться несколько раз, но следующее другое число всегда увеличивается на 1, кроме 5 оно будет сбрасываться на 1, правильно?
столбец2=x и столбец3=y, столбец1 повторяет числа от 1 до 5 (иногда промежуточные числа могут отсутствовать), после ряда 5 всегда будет 1.
@fae хм, другими словами, вы хотите разделить свои данные (т. Е. Начать новую кривую линии / точек линии) после последних 5 в последовательности (от 1 до 5). Что такое N
? В вашем примере это 2
. Как насчет ключа/легенды? Если N очень велико, нет смысла иметь сотни ключевых записей. Как насчет цвета, какие цвета вы хотите? И, пожалуйста, отредактируйте свой вопрос и добавьте несколько полных минимизированных данных примера!
Я отредактировал вопрос, чтобы он был более полным. Я предполагаю, что «N» будет не менее 100. Цвет не важен, и мне не нужен ключ.
@fae спасибо за редактирование. Если значения x не увеличиваются постоянно в диапазоне от 1 до 5, почему вы хотите строить графики с точками? Это даст некоторый зигзаг назад и вперед, это предназначено? Пока я только понимаю, что вы хотите начинать новую кривую после каждой завершенной последовательности 1 to 5
(но без смены цвета и без ввода ключа), правильно? Мне нравится находить решения каверзных проблем, но кажется, что каверзная проблема заключается в том, чтобы выяснить, чего вы действительно хотите ;-).
ахахах, я знаю, что звучу очень смущенно (скорее всего, так оно и есть). Код работает отлично спасибо. И сегодня я предлагаю вам еще один вызов: что, если бы у меня был столбец 4, где иногда значение больше > 0 (не важно, насколько велико число, просто больше 0), и каждый раз в столбце 4 число больше 0 Я хочу, чтобы эта конкретная последовательность от 1 до 5 была удалена и переходила к следующей. Outup должен выглядеть так же сверху. Или, если проще закодировать эту последовательность, чтобы она имела другой цвет.
@fae хорошо, если это помогло решить вашу проблему, пожалуйста, проголосуйте и примите, указав, что на вопрос дан ответ. Для новой задачи, пожалуйста, начните новый вопрос (иначе это будет слишком запутанно) и добавьте некоторые разумные тестовые данные, которые приведут к разумному результату. О пропуске, когда столбец 4> 0, это, вероятно, простая задача фильтрации (но также зависит от деталей, например, если одно значение в этой последовательности> 0, пропустить всю последовательность?). Итак, пожалуйста, точно опишите, что у вас есть (структура, формат данных и т. д.) и укажите, что именно вы хотите.
что ты уже испробовал? Пожалуйста, покажите ваш (не)рабочий скрипт и результат.