2012-06-27 40 views
7

Tôi đang sử dụng gnuplot lệnh sau để tạo ra một âm mưu:gnuplot, cách chỉ gắn nhãn một số điểm nhất định?

#!/bin/bash 
gnuplot << 'EOF' 
set term postscript portrait color enhanced 
set output 'out.ps' 

plot 'data_file' u 3:2 w points , '' u 3:2:($4!=-3.60 ? $1:'aaa') w labels 

EOF 

nơi data_file trông như thế này:

O4  -1.20  -0.33  -5.20 
O9.5  -1.10  -0.30  -3.60 
    B0  -1.08  -0.30  -3.25 
B0.5  -1.00  -0.28  -2.60 
B1.5  -0.90  -0.25  -2.10 
B2.5  -0.80  -0.22  -1.50 
    B3  -0.69  -0.20  -1.10 

Tôi muốn gnuplot nhãn tất cả điểm với chuỗi tìm thấy trong cột 1, ngoại trừ nơi cột 4 bằng -3.60 trong trường hợp này, tôi muốn có dấu phẩy là aaa ng. Điều tôi nhận được là điểm dữ liệu $4=-3.60 đang được gắn nhãn chính xác là aaa, nhưng phần còn lại không được gắn nhãn ở tất cả.


Cập nhật: gnuplot không có vấn đề cho thấy số như nhãn sử dụng câu lệnh điều kiện, ví dụ: bất kỳ cột nhưng 1 được hiển thị một cách chính xác như một nhãn cho mỗi điểm tôn trọng các điều kiện áp dụng. Đó là, dòng này sẽ hiển thị cột 2 (numbres) như nhãn điểm tôn trọng tuyên bố có điều kiện:

plot 'data_file' u 3:2 w points , '' u 3:2:($4!=-3.60 ? $2:'aaa') w labels 

Cập nhật 2: Nó cũng không có vấn đề trong âm mưu cột 1 như nhãn điểm nếu tôi vẽ nó như là một toàn bộ, tức là không sử dụng câu lệnh có điều kiện. Đó là, dòng này âm mưu chính xác tất cả nhãn điểm trong cột 1 (chuỗi):

plot 'data_file' u 3:2 w points , '' u 3:2:1 w labels 

Vì vậy, rõ ràng vấn đề là trong sử dụng câu lệnh điều kiện cùng với cột dây. Bất kỳ cách nào trong số này được sử dụng riêng đều hoạt động tốt.

Trả lời

5

Trong một cách rõ ràng hơn, điều này có thể hoạt động. Có vẻ như nhãn không thể hiển thị số được tính nếu nó không được chuyển thành chuỗi.

#!/bin/bash 
gnuplot << 'EOF' 
set term postscript portrait color enhanced 
set output 'out.ps' 

plot 'data_file' u 3:2 w points , '' u 3:2:($4!=-3.60 ? sprintf("%d",$1):'aaa') w labels 

EOF 
+0

Giải pháp này không hiệu quả đối với tôi. Tất cả những gì tôi nhận được là một nhãn đơn ('aaa') đại diện cho một nhãn mà OP muốn xóa ... làm 'sprintf ("% d ", $ 1)' chỉ hoạt động nếu dữ liệu trong cột 1 là số nguyên. làm 'sprintf ("% s ", $ 1)' cũng không hoạt động. Am i thiếu cái gì ở đây? – mgilson

+0

Tôi không có gnuplot xung quanh để kiểm tra, nhưng có lẽ nó khác nhau nếu dòng đầu tiên của cột 1 không chứa một số (trong trường hợp đó toàn bộ điều sprintf không cần thiết). Tôi thú nhận tôi đã thử nó trên một datafile của tôi, và không chính xác trên OP của một ... Tôi cũng sẽ cố gắng '(($ 4! = - 3.60)? ''. $ 1: 'aaa'' để buộc chuyển đổi chuỗi chỉ –

+0

Các công trình sau đây ($ 4 ne '-3.60'? stringcolumn (1): '') '(stringcolumn là một cách tốt hơn so với sử dụng chuỗi nối), nhưng thử nghiệm này thực sự khá mong manh vì nó đang làm một chuỗi so sánh trên '-3.60' thay vì so sánh float (ví dụ -3.6 vẫn sẽ đặt nhãn trên đó) Vấn đề ở đây là vì gnuplot đang vẽ nhãn, nó mong đợi các chuỗi trong trường đó (chuyển đổi cột 4 thành chuỗi trên Điều này cũng để lại (trống) chuỗi trong đầu ra mà thổi phồng nó. Giải pháp tốt nhất là một trong những tôi đề xuất dưới đây (IMHO) - chỉ cần di chuyển các bộ lọc và nó hoạt động tốt – mgilson

3

Đây có phải là những gì bạn muốn không?

#!/bin/bash 

gnuplot << 'EOF' 
set term postscript portrait color enhanced 
set output 'out.ps' 
plot 'data_file' u 3:2 w points , \ 
    '' u (($4 == -3.60)? 1/0 : $3):2:1 w labels 

EOF 

Tất cả tôi làm ở đây được thiết lập (x) chỉ nơi cột 4 bằng -3,6 đến NaN (1/0). Kể từ khi gnuplot bỏ qua những điểm, cuộc sống là tốt. Tôi nghĩ rằng vấn đề với kịch bản của bạn là bạn đã lọc một cột nơi gnuplot mong đợi đầu vào chuỗi - mặc dù tôi chưa chơi đủ để xác minh điều đó. Tôi vừa chuyển bộ lọc sang cột nơi gnuplot mong đợi các con số (vị trí x) và nó hoạt động tốt.

+0

Yesss! Cảm ơn bạn rất nhiều, tôi đã hết ý tưởng để thử. Chúc mừng! – Gabriel

+1

@Gaba_p - Rất vui được trợ giúp. giữ (gnu) âm mưu! :) – mgilson

Các vấn đề liên quan