2013-09-03 31 views
5

tập tin dữ liệu của tôi có nội dung nàyGnuplot: Làm thế nào để tải và hiển thị giá trị số duy nhất từ ​​tập tin dữ liệu

# data file for use with gnuplot 
# Report 001 
# Data as of Tuesday 03-Sep-2013 
total 1976 
case1 522 278 146 65 26 7 
case2 120 105 15 0 0 0 
case3 660 288 202 106 63 1 

Tôi đang làm cho một biểu đồ từ trường hợp ... dòng bằng cách sử dụng kịch bản dưới đây - và làm việc. Câu hỏi của tôi là: làm thế nào tôi có thể tải tổng giá trị lớn 1976 (bên cạnh từ 'tổng') từ tệp dữ liệu và (a) lưu trữ nó vào một biến hoặc (b) sử dụng nó trực tiếp trong tiêu đề của ô?

Đây là kịch bản gnuplot tôi:

reset 
set term png truecolor 
set terminal pngcairo size 1024,768 enhanced font 'Segoe UI,10' 
set output "output.png" 
set style fill solid 1.00 
set style histogram rowstacked 
set style data histograms 
set xlabel "Case" 
set ylabel "Frequency" 
set boxwidth 0.8 
plot for [i=3:7] 'mydata.dat' every ::1 using i:xticlabels(1) with histogram \ 
notitle, '' every ::1 using 0:2:2 \ 
with labels \ 
title "My Title" 

Vì lợi ích của những người khác cố gắng để nhãn biểu đồ, trong tập tin dữ liệu của tôi, cột sau nhãn trường hợp đại diện cho tổng của phần còn lại của các giá trị trên hàng đó . Tổng số đó được hiển thị ở đầu mỗi thanh biểu đồ. Ví dụ cho case1, 522 là tổng số (278 + 146 + 65 + 26 + 7).

Tôi muốn hiển thị tổng số lớn ở đâu đó trên biểu đồ của tôi, được gọi là dòng thứ hai của tiêu đề hoặc trong nhãn. Tôi có thể nhận được một biến thành sprintf vào tiêu đề, nhưng tôi đã không tìm ra cú pháp để tải một giá trị "ô" ("ô" có nghĩa là giao điểm cột hàng) vào một biến. Ngoài ra, nếu ai đó có thể cho tôi biết cách sử dụng hàm tổng để tăng tổng cộng 522 + 120 + 660 (đọc từ tệp dữ liệu, không phải là hằng số!) Và lưu tổng số đó vào một biến, điều đó sẽ làm giảm bớt nhu cầu để có tổng số lớn trong tệp dữ liệu và điều đó cũng sẽ khiến tôi rất hạnh phúc.

Rất cám ơn.

Trả lời

11

Cho phép bắt đầu bằng cách trích xuất một ô đơn lẻ tại (hàng, col). Nếu đó là một giá trị duy nhất, bạn có thể sử dụng lệnh stats để trích xuất các giá trị. Các số rowcol được chỉ định với everyusing, như trong lệnh lô. Trong trường hợp của bạn, để trích xuất các giá trị tổng, sử dụng:

# extract the 'total' cell 
stats 'mydata.dat' every ::::0 using 2 nooutput 
total = int(STATS_min) 

Tổng hợp tất cả các giá trị trong cột thứ hai, sử dụng:

stats 'mydata.dat' every ::1 using 2 nooutput 
total2 = int(STATS_sum) 

Và cuối cùng, để tổng hợp tất cả các giá trị trong cột 3:7 trong tất cả các hàng (ví dụ giống như lệnh trước đó, nhưng không sử dụng tổng số đã lưu), hãy sử dụng:

# sum all values from columns 3:7 from all rows 
stats 'mydata.dat' every ::1 using (sum[i=3:7] column(i)) nooutput 
total3 = int(STATS_sum) 

Các lệnh này yêu cầu gnuplot 4.6 hoạt động.

Vì vậy, kịch bản âm mưu của bạn có thể trông giống như sau:

reset 
set terminal pngcairo size 1024,768 enhanced 
set output "output.png" 
set style fill solid 1.00 
set style histogram rowstacked 
set style data histograms 
set xlabel "Case" 
set ylabel "Frequency" 
set boxwidth 0.8 

# extract the 'total' cell 
stats 'mydata.dat' every ::::0 using 2 nooutput 
total = int(STATS_min) 

plot for [i=3:7] 'mydata.dat' every ::1 using i:xtic(1) notitle, \ 
    '' every ::1 using 0:(s = sum [i=3:7] column(i), s):(sprintf('%d', s)) \ 
    with labels offset 0,1 title sprintf('total %d', total) 

mang đến cho đầu ra sau đây:

enter image description here

+1

Ah ha !! Ví dụ tuyệt vời về việc sử dụng lệnh thống kê để tải (các) giá trị ô. – user424855

+2

@Christoph Luôn luôn là một niềm vui để đọc các bài viết liên quan đến Gnuplot của bạn, các công cụ rất hữu ích :) – EverythingRightPlace

+0

Thuộc tính: cú pháp là gì? Tôi không hiểu những gì :::: 0 hoặc :: 1 là nghĩa vụ phải làm - ai đó có thể giải thích cho tôi? – user3728501

1

Đối với Linux và tương tự.

Nếu bạn không biết số hàng nơi dữ liệu của bạn được đặt, nhưng bạn biết nó nằm trong cột thứ n của hàng mà giá trị của cột thứ m là x, bạn có thể xác định hàm

get_data(m,x,n,filename)=system('awk "\$'.m.'==\"'.x.'\"{print \$'.n.'}" '.filename) 

và sau đó sử dụng nó, ví dụ như

y = get_data(1,"case2",4,"datafile.txt") 

sử dụng dữ liệu được cung cấp bởi user424855

print y 

phải trả lại 15

+0

Tốt. Bạn có một lỗi nhỏ, lệnh nên đọc: 'get_data (m, x, n, tên tệp) = hệ thống ('awk' \ $ '. M.' == \" '. X.' \ "{Print \ $ '.n.'} "'.filename)'. – Christoph

+0

cảm ơn bạn, nó đã được sửa ngay bây giờ, :) – boclodoa

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