Trực Quan Dữ Liệu Theo ý Của Bạn Với Gnuplot | VnCFD

Trực quan dữ liệu theo ý của bạn với Gnuplot Trong quá trình xử lý dữ liệu bạn phải làm việc với những con số. Những con số nói lên tất cả, chứa đựng toàn bộ thông tin mà bạn cần có. Thế nhưng, những con số đôi lúc lại không phải là tất cả. Chẳng hạn, đó là sự phân bố áp suất trên bề mặt cánh máy bay như một hàm số vào tọa độ dưới dạng các cột tọa độ x,y,z và p lưu trong một file text hoặc file nhị phân. Công việc lúc này của bạn không phải là mở file đó ra để đọc số liệu tại hàng triệu điểm như thế mà là chuyển đổi nó thành một ngôn ngữ dễ “ngấm” hơn. Đó chính là mã màu, hay nói cách khác, đó là trực quan hóa dữ liệu của bạn thành hình ảnh. Bài viết này, tôi muốn giới thiệu một vài kỹ thuật làm việc với contour để tùy biến quá trình trực quan dữ liệu của bạn với phần mềm mã nguồn mở Gnuplot. Chuẩn bị: Đảm bảo trên máy của bạn có chương trình gnuplot chạy được, chương trình awk, file dữ liệu bất kì. Tiến hành: Để mô phỏng cho các kỹ thuật sẽ được trình bày dưới đây tôi sẽ sử dụng dữ liệu mang tính chất tượng trưng, các bạn có thể hoàn toàn tự tạo ra các dữ liệu của mình theo ý thích. Đầu tiên, chúng ta sẽ mô phỏng những khả năng “sẵn có” của gnuplot. File dữ liệu của tôi là file có tên ‘00245’, cột thứ nhất ghi tọa độ x, cột thứ hai ghi tọa độ y, cột thứ ba là áp suất tại điểm (x,y). Chúng ta sẽ trực quan hóa phân bố áp suất từ những con số trong file này. Vì đây là dữ liệu mà tôi tạo ra nên tôi đã biết được các giá trị min, max của x,y, và áp suất p. Trong trường hợp dữ liệu đó không phải là của bạn, có thể sử dụng một module nhỏ viết bằng awk để tìm các giá trị này!

reset set term png size 1680, 1024 crop set size ratio 0.5 set output '00245_1.png' set xrange[0:2] set yrange[0:1] set pm3d set palette rgbformulae 7,25,5 set pm3d map splot '00245' notitle Nhìn vào hình ảnh chúng ta đã có được đôi chút “thông tin” về những gì ẩn chứa trong hộp đen với cái tên ‘00245’ đã đề cập tới ở trên. Để hình ảnh giàu thông tin hơn, ngoài mã màu sắc (coded-color) chúng ta sẽ thêm các contours (thường là đường đồng mức, đẳng trị, đẳng thế, …, trong trường hợp này là đẳng áp). Thống nhất ý tưởng rằng trước hết chúng ta sử dụng “cây nhà lá vườn” để phục vụ mục đích tăng gia, sau đó mới nghĩ đến chuyện thêm bớt “mì chính mắm muối” để mùi vị hấp dẫn hơn. set contour base set cntrparam level incremental 0.9, 0.01, 1.5 unset surf set xrange[0:2] set yrange[0:1] set term png size 2000, 800 crop set size ratio 0.5 set pm3d set palette rgbformulae 7,25,5 set pm3d map set output '00245_1.png' splot '00245' Bức tranh của chúng ta đang gợi lên những cảnh tượng ngày càng hấp dẫn hơn. Tuy nhiên, phụ thuộc vào mục đích từng người, nhiều khi nó sẽ phát sinh thêm một vài vấn đề. Ví dụ, nếu dữ liệu của bạn là rất lớn, số lượng hình ảnh cần phải thu được là rất nhiều với chất lượng tốt và rất tốt. Khi đó, vấn đề đặt ra là làm thế nào để giảm thiểu được kích thước mỗi hình ảnh như thế này? Ta có thể giải quyết vấn đề đặt khi thay splot(3d) bằng hàm plot(2d). Vấn đề tiếp theo là các đường đẳng áp ở trên bức tranh có màu sắc bất kì, làm thế nào để tùy biến theo ý của bạn? Làm thế nào để có thể thêm “nhãn” (label) cho chúng? Chúng ta lần lượt xem xét các vấn đề đặt ra ngay dưới đây. Trước hết, thay splot bằng plot set table 'image' splot '00245' unset table

set contour base set cntrparam level incremental 0.9, 0.01, 1.5 unset surf set table 'cont' splot '00245' unset table

set term png size 2000, 800 crop set size ratio 0.5 set pm3d set palette rgbformulae 7,25,5 set pm3d map set output '00245_1.png' set xrange[0:2] set yrange[0:1] set size ratio 0.5 plot 'image' with image, 'cont' notitle w l lw 2 lt -1 Bức tranh hiện ra ngày càng quyến rũ hơn! Tuy nhiên, vấn đề về màu sắc các đường đẳng áp (có cùng áp suất) lại đặt ra. Chúng chỉ có duy nhất một màu đen! Làm thế nào để có thể tô màu sắc cho chúng? Hơn nữa, chúng vẫn chưa được gán nhãn. Bây giờ chúng ta sẽ thêm nhãn và tô màu cho chúng. Khi làm việc dưới hệ điều hành LINUX ta tận dụng được lợi thế làm việc với hệ BASH, với Windows, ta không có được ưu thế như vậy. Để tạo ra labels (nhãn) cho các đường đẳng áp (contours) này, ta phải đụng chạm một chút tới ngôn ngữ kịch bản awk. Thông số để thiết lập nhãn cho các đường đồng mức gồm có d — thiết lập nhãn hay không (mặc định d=0 — có thiết lập nhãn, d!=0 — không thiết lập nhãn, d=2 — tô màu cho các đường đồng mức). Khi ghi nhãn để chúng không đè lên các đường, chúng ta xóa một vùng của đường đi và thay bằng khoảng trắng, os — vị trí đặt khoảng trắng, w — độ dài của khoảng trắng. Như vậy, bây giờ chúng ta có các công việc sau: 1. Tạo ra một file chứa dữ liệu thô, tôi gọi đó là ‘row_data’ 2. Tạo ra một file dữ liệu chứa ảnh nền, gọi đó là ‘image.dat’ 3. Tạo ra một file chứa nhãn của các đường đồng mức và màu sắc của các nhãn, gọi đó là ‘cont.label’ 4. Tạo ra một file chứa dữ liệu cho các đường đồng mức tương ứng với nhãn của chúng, gọi đó là ‘cont.dat’ 5. Cuối cùng, tạo ra một file để ghép chúng lại với nhau, tức là ghép ảnh nền với các đường đồng mức và nhãn của chúng với màu sắc tương ứng, gọi đó là ‘cont.plt’ Nào, cùng bắt tay vào việc. Đầu tiên, để tạo ra dữ liệu thô, ta sử dụng các dòng lệnh sau: set cont base set cntrparam level incremental 0.8, 0.025, 1.5 unset surf set table 'row_data' splot '00245' unset table Tiếp theo, để tạo ra file dữ liệu chứa ảnh nền, ta làm như sau: set xrange [0:2] set yrange [0:1] set table 'image.dat splot '00245' unset table Để tạo ra nhãn, ta gọi kịch bản awk từ môi trường gnuplot như sau: !awk -f cont.awk cont.label Để tạo ra dữ liệu cho các đường đồng mức, ta lại tiếp tục gọi awk từ môi trường gnuplot: !awk -f cont.awk cont.dat Cuối cùng, tạo ra file để ghép tất cả mọi thứ lại với nhau: !awk -f cont.awk cont.plt Bây giờ, ta có thể gọi trực tiếp trình thực thi gnuplot để load file ‘cont.plt’ bằng dòng lệnh: load ‘cont.plt’ Tất cả các bước trên có thể gói gọn lại thành đoạn mã sau: set table 'image.dat' splot '00245' unset table

set cont base set cntrparam level incremental 0.8, 0.04, 1.5 unset surf set table 'row_data' splot '00245' unset table

unset key !awk -f E:\STUDY\vncfd\versions6.06.2012\cont.awk cont.label !awk -f E:\STUDY\vncfd\versions6.06.2012\cont.awk cont.dat !awk -f E:\STUDY\vncfd\versions6.06.2012\cont.awk cont.plt

set term png size 2200, 800 crop set size ratio 0.5 set output '00245_3.png' set xrange [0:2] set yrange [0:1] set palette rgbformulae 7,25,5 set cbrange [0.8:1.5] load 'cont.plt' Và đây là sản phẩm của chúng ta: Bức tranh hiện lên không chỉ với đầy đủ thông tin hơn, mà nó còn đẹp, hấp dẫn và quyến rũ hơn! Tôi có thể khẳng định một điều như vậy! Công việc của tôi đến đây đã gần như là xong xuôi. Cuối cùng tôi sẽ cung cấp cho các bạn đoạn mã code của file ‘cont.awk’ kì diệu đã sử dụng ở trên.

Mã code của file ‘cont.awk’, bạn cũng hoàn toàn có thể tự viết và tùy biến theo mong muốn và mục đích của bản thân:

function color(x) {return int((x-low)/itval) } function abs(x) { return (x>=0?x:-x) }

BEGIN { low = 0.8 itval = 0.01 lw = 2 }

{ if($0~/# Contour/) nr=0 if(nr==int(os+w/2) && (d%2)==0 && NF!=0) {i++; a[i]=$1; b[i]=$2; c[i]=$3;} if(nr==int(os+w/2)-1 && (d%2)==0 && NF!=0) {x=$1; y=$2;} if(nr==int(os+w/2)+1 && (d%2)==0 && NF!=0) r[i]=180.0*atan2(y-$2, x-$1) if(abs(nr-os-w/2)>w/2 && (d%2)==1) print $0 nr++ }

END { if(d==0) { for(j=1;j<=i;j++) { printf("set label \"%g\" at %g, %g centre front rotate by %d tc lt %d font \"Arial, 16\"\n", c[j], a[j], b[j], r[j], color(c[j])) } } if(d==2) { printf "l \"cont.label\"\n" printf "plot \"image.dat\" w ima notitle, " for(j=1;j<=i;j++) { if (j==1) { printf "\"cont.dat\" index %d title \"%.3f\" w l lt %d lw %d,\\\n", j-1, c[j], color(c[j]), lw } else if (j!=i) { printf "\"\" index %d title \"%.3f\" w l lt %d lw %d,\\\n", j-1, c[j], color(c[j]), lw } else { printf "\"\" index %d title \"%.3f\" w l lt %d lw %d\n", j-1, c[j], color(c[j]), lw } } } }

Bài viết của tôi đến đây là kết thúc. Cuối cùng, để đóng lại chủ đề tôi đưa ra một vài hình ảnh đẹp mắt sử dụng những kỹ thuật đã mô tả ở trên để thực hiện. Hình ảnh với nhiều plot, subplot minh họa phóng to một vùng quan trọng trong main plot Không sử dụng màu nền mà chỉ vẽ các đường đồng mức với màu than chì

Có thể sử dụng thêm một script python nữa để tạo ra hàng loạt hình ảnh như trên và ghép chúng thành video. Dưới đây là một ví dụ nhỏ để minh họa điều này: Chúc các bạn vui vẻ và thành công!

Chia sẻ:

  • X
  • Facebook
Thích Đang tải...

Có liên quan

Từ khóa » Cách Dùng Gnuplot