2009-04-19 57 views
22

Tôi đang thực hiện mô phỏng khám phá nhỏ và tôi muốn hiển thị biểu đồ để so sánh hiệu suất giữa các thuật toán trong thời gian chạy.Cách dễ dàng để vẽ đồ thị và biểu đồ trong C++?

Thư viện nào xuất hiện trong đầu bạn? Tôi rất thích những người đến nhỏ như tôi rất thích nếu người hướng dẫn của tôi dễ dàng biên dịch mã của tôi. Tôi đã kiểm tra gdchart nhưng có vẻ như quá nặng. Tôi chỉ muốn một biểu đồ dòng thời gian x-y đơn giản.

Biểu đồ Google tất nhiên là không có câu hỏi, trong trường hợp bạn đã đọc this câu hỏi tương tự.


Bài liên quan Scatter Plots in C++.

+0

Windows nhưng tôi thực sự thích sử dụng nhiều nền tảng khi tôi mã hóa trên Linux hầu hết thời gian và những người chỉ dẫn của tôi sử dụng các cửa sổ. – syaz

+0

kiểm tra http://stackoverflow.com/questions/215110/scatter-plots-in-c/40612951#40612951 – SAAD

Trả lời

12

ưa thích của tôi luôn luôn là gnuplot. Nó rất rộng, vì vậy nó có thể là một chút quá phức tạp cho nhu cầu của bạn mặc dù. Nó là nền tảng chéo và có a C++ API.

+0

Cảm ơn, nó chắc chắn là một con thú, dễ sử dụng hơn pplot quá. – syaz

6

Tôi đã sử dụng "máy vẽ xách tay" này. Nó rất nhỏ, đa nền tảng, dễ sử dụng và bạn có thể cắm nó vào các thư viện đồ họa khác nhau. pplot

(Chỉ dành cho phần lô)

Nếu bạn sử dụng hoặc kế hoạch sử dụng Qt, một giải pháp đa nền là QwtQchart

+0

Điều này có vẻ đầy hứa hẹn, ví dụ được hiển thị thực sự đơn giản hơn nhiều so với gdchart. – syaz

10

Thành thực mà nói, tôi đã ở lại trên thuyền giống như bạn. Tôi đã có một thư viện C++ mà tôi muốn kết nối với một tiện ích vẽ đồ thị. Tôi đã sử dụng Boost Pythonmatplotlib. Đó là một trong những tốt nhất mà tôi có thể tìm thấy.

Lưu ý: Tôi cũng cảnh giác với việc cấp phép. matplotlib và các thư viện tăng có thể được tích hợp vào các ứng dụng độc quyền.

Dưới đây là một ví dụ về mã mà tôi đã sử dụng:

#include <boost/python.hpp> 
#include <pygtk/pygtk.h> 
#include <gtkmm.h> 

using namespace boost::python; 
using namespace std; 

// This is called in the idle loop. 
bool update(object *axes, object *canvas) { 
    static object random_integers = object(handle<>(PyImport_ImportModule("numpy.random"))).attr("random_integers"); 
    axes->attr("scatter")(random_integers(0,1000,1000), random_integers(0,1000,1000)); 
    axes->attr("set_xlim")(0,1000); 
    axes->attr("set_ylim")(0,1000); 
    canvas->attr("draw")(); 
    return true; 
} 

int main() { 
    try { 
     // Python startup code 
     Py_Initialize(); 
     PyRun_SimpleString("import signal"); 
     PyRun_SimpleString("signal.signal(signal.SIGINT, signal.SIG_DFL)"); 

     // Normal Gtk startup code 
     Gtk::Main kit(0,0); 

     // Get the python Figure and FigureCanvas types. 
     object Figure = object(handle<>(PyImport_ImportModule("matplotlib.figure"))).attr("Figure"); 
     object FigureCanvas = object(handle<>(PyImport_ImportModule("matplotlib.backends.backend_gtkagg"))).attr("FigureCanvasGTKAgg"); 

     // Instantiate a canvas 
     object figure = Figure(); 
     object canvas = FigureCanvas(figure); 
     object axes = figure.attr("add_subplot")(111); 
     axes.attr("hold")(false); 

     // Create our window. 
     Gtk::Window window; 
     window.set_title("Engineering Sample"); 
     window.set_default_size(1000, 600); 

     // Grab the Gtk::DrawingArea from the canvas. 
     Gtk::DrawingArea *plot = Glib::wrap(GTK_DRAWING_AREA(pygobject_get(canvas.ptr()))); 

     // Add the plot to the window. 
     window.add(*plot); 
     window.show_all(); 

     // On the idle loop, we'll call update(axes, canvas). 
     Glib::signal_idle().connect(sigc::bind(&update, &axes, &canvas)); 

     // And start the Gtk event loop. 
     Gtk::Main::run(window); 

    } catch(error_already_set) { 
     PyErr_Print(); 
    } 
} 
+1

Bạn sẽ có một ví dụ đơn giản về cách bạn đã làm điều này, tôi rất muốn tìm hiểu. –

+1

@ZamfirKerlukson: http://blog.wlynch.cx/2009/11/03/Matplotlib/ –

+0

Đây là đá quý. Cám ơn vì đã chia sẻ. Cả hai hữu ích và kỳ lạ. – nurettin

4

Cern ROOT tạo ra một số nội dung khá hay, tôi sử dụng nó để hiển thị dữ liệu mạng Neural rất nhiều.

+1

Mặc dù tất nhiên ROOT không phải là một bổ sung nhẹ cho môi trường làm việc của bạn, cũng không tầm thường để sử dụng. Tuy nhiên, tôi đang ở trong ngành vật lý hạt, vì vậy hãy sử dụng nó hầu như độc quyền. – dmckee

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