[wxWidgets] wxCharts 차트 그리기
C, C++ 2026. 5. 4. 16:42 |반응형
wxCharts를 이용해 차트를 그려보자.

Include, Library 등을 적당히 세팅한다.
#include <wx/wx.h>
#include <wxcharts/wx/charts/wxchart.h> // wxCharts 라이브러리의 헤더 파일을 포함한다.
#include <wxcharts/wx/charts/wxbarchartctrl.h> // wxBarChartCtrl 클래스의 헤더 파일을 포함한다.
#pragma comment(lib, "wxchartsd.lib") // wxCharts 라이브러리를 링크한다.
class MyApp : public wxApp
{
public:
bool OnInit() override;
};
wxIMPLEMENT_APP(MyApp);
class MyFrame : public wxFrame
{
public:
MyFrame();
private:
void OnHello(wxCommandEvent& event);
void OnExit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
wxPanel* panel;
};
enum
{
ID_Hello = 1
};
bool MyApp::OnInit()
{
MyFrame* frame = new MyFrame();
frame->Show(true);
return true;
}
// 메인 프레임의 위치(default position)와 크기(550x400)를 설정한다.
MyFrame::MyFrame() : wxFrame(nullptr, wxID_ANY, "Hello World", wxDefaultPosition, wxSize(550, 400))
{
wxMenu* menuFile = new wxMenu;
menuFile->Append(ID_Hello, "&Hello...\tCtrl-H", "Help string shown in status bar for this menu item");
menuFile->AppendSeparator();
menuFile->Append(wxID_EXIT);
wxMenu* menuHelp = new wxMenu;
menuHelp->Append(wxID_ABOUT);
wxMenuBar* menuBar = new wxMenuBar;
menuBar->Append(menuFile, "&File");
menuBar->Append(menuHelp, "&Help");
SetMenuBar(menuBar);
CreateStatusBar();
SetStatusText("Welcome to wxWidgets!");
panel = new wxPanel(this, wxID_ANY);
wxButton* myButton = new wxButton(panel, wxID_ANY, "Press Me", wxPoint(420, 30), wxSize(100, 30));
myButton->Bind(wxEVT_BUTTON, &MyFrame::OnHello, this);
Bind(wxEVT_MENU, &MyFrame::OnHello, this, ID_Hello);
Bind(wxEVT_MENU, &MyFrame::OnAbout, this, wxID_ABOUT);
Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT);
}
void MyFrame::OnExit(wxCommandEvent& event)
{
Close(true);
}
void MyFrame::OnAbout(wxCommandEvent& event)
{
wxMessageBox("This is a wxWidgets Hello World example", "About Hello World", wxOK | wxICON_INFORMATION);
}
void MyFrame::OnHello(wxCommandEvent& event)
{
//wxLogMessage("Hello world from wxWidgets!");
// wxCharts 라이브러리를 사용하여 막대 그래프를 생성
// Create the data for the bar chart widget
wxVector<wxString> labels;
labels.push_back("January");
labels.push_back("February");
labels.push_back("March");
labels.push_back("April");
labels.push_back("May");
labels.push_back("June");
labels.push_back("July");
wxChartsCategoricalData::ptr chartData = wxChartsCategoricalData::make_shared(labels);
// Add the first dataset
wxVector<wxDouble> points1;
points1.push_back(3);
points1.push_back(2.5);
points1.push_back(1.2);
points1.push_back(3);
points1.push_back(6);
points1.push_back(5);
points1.push_back(1);
wxChartsDoubleDataset::ptr dataset1(new wxChartsDoubleDataset("Dataset 1", points1));
chartData->AddDataset(dataset1);
// Add the second dataset
wxVector<wxDouble> points2;
points2.push_back(1);
points2.push_back(1.33);
points2.push_back(2.5);
points2.push_back(2);
points2.push_back(3);
points2.push_back(1.8);
points2.push_back(0.4);
wxChartsDoubleDataset::ptr dataset2(new wxChartsDoubleDataset("Dataset 2", points2));
chartData->AddDataset(dataset2);
// Create the bar chart widget
wxBarChartCtrl* barChartCtrl = new wxBarChartCtrl(panel, wxID_ANY, chartData);
barChartCtrl->SetSize(400, 300);
// Set up the sizer for the panel
//wxBoxSizer* panelSizer = new wxBoxSizer(wxHORIZONTAL);
//panelSizer->Add(barChartCtrl, 1, wxEXPAND);
//panel->SetSizer(panelSizer);
}


grid를 없애 보자.
void MyFrame::OnHello(wxCommandEvent& event)
{
//wxLogMessage("Hello world from wxWidgets!");
// wxCharts 라이브러리를 사용하여 막대 그래프를 생성
// Create the data for the bar chart widget
wxVector<wxString> labels;
labels.push_back("January");
labels.push_back("February");
labels.push_back("March");
labels.push_back("April");
labels.push_back("May");
labels.push_back("June");
labels.push_back("July");
wxChartsCategoricalData::ptr chartData = wxChartsCategoricalData::make_shared(labels);
// Add the first dataset
wxVector<wxDouble> points1;
points1.push_back(3);
points1.push_back(2.5);
points1.push_back(1.2);
points1.push_back(3);
points1.push_back(6);
points1.push_back(5);
points1.push_back(1);
wxChartsDoubleDataset::ptr dataset1(new wxChartsDoubleDataset("Dataset 1", points1));
chartData->AddDataset(dataset1);
// Add the second dataset
wxVector<wxDouble> points2;
points2.push_back(1);
points2.push_back(1.33);
points2.push_back(2.5);
points2.push_back(2);
points2.push_back(3);
points2.push_back(1.8);
points2.push_back(0.4);
wxChartsDoubleDataset::ptr dataset2(new wxChartsDoubleDataset("Dataset 2", points2));
chartData->AddDataset(dataset2);
// barchart 옵션 설정
wxBarChartOptions::ptr options(new wxBarChartOptions());
// 라이브러리의 GetGridOptions()가 const 참조만 반환하므로
// const_cast를 사용하여 상수성을 일시적으로 제거하여 옵션을 수정한다.
wxChartsGridOptions& gridOptions = const_cast<wxChartsGridOptions&>(options->GetGridOptions());
gridOptions.GetHorizontalGridLineOptions().SetShowGridLines(false);
gridOptions.GetVerticalGridLineOptions().SetShowGridLines(false);
// Create the bar chart widget with options
wxBarChartCtrl* barChartCtrl = new wxBarChartCtrl(panel, wxID_ANY, chartData, options);
barChartCtrl->SetSize(400, 300);
// Set up the sizer for the panel
//wxBoxSizer* panelSizer = new wxBoxSizer(wxHORIZONTAL);
//panelSizer->Add(barChartCtrl, 1, wxEXPAND);
//panel->SetSizer(panelSizer);
}

세로 막대 그래프를 그려 보자.
#include <wx/wx.h>
#include <wxcharts/wx/charts/wxchart.h> // wxCharts 라이브러리의 헤더 파일을 포함한다.
#include <wxcharts/wx/charts/wxcolumnchartctrl.h> // wxColumnChartCtrl 클래스의 헤더 파일을 포함한다.
#pragma comment(lib, "wxchartsd.lib") // wxCharts 라이브러리를 링크한다.
class MyApp : public wxApp
{
public:
bool OnInit() override;
};
wxIMPLEMENT_APP(MyApp);
class MyFrame : public wxFrame
{
public:
MyFrame();
private:
void OnHello(wxCommandEvent& event);
void OnExit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
wxPanel* panel;
};
enum
{
ID_Hello = 1
};
bool MyApp::OnInit()
{
MyFrame* frame = new MyFrame();
frame->Show(true);
return true;
}
// 메인 프레임의 위치(default position)와 크기(550x400)를 설정한다.
MyFrame::MyFrame() : wxFrame(nullptr, wxID_ANY, "Hello World", wxDefaultPosition, wxSize(550, 400))
{
wxMenu* menuFile = new wxMenu;
menuFile->Append(ID_Hello, "&Hello...\tCtrl-H", "Help string shown in status bar for this menu item");
menuFile->AppendSeparator();
menuFile->Append(wxID_EXIT);
wxMenu* menuHelp = new wxMenu;
menuHelp->Append(wxID_ABOUT);
wxMenuBar* menuBar = new wxMenuBar;
menuBar->Append(menuFile, "&File");
menuBar->Append(menuHelp, "&Help");
SetMenuBar(menuBar);
CreateStatusBar();
SetStatusText("Welcome to wxWidgets!");
panel = new wxPanel(this, wxID_ANY);
wxButton* myButton = new wxButton(panel, wxID_ANY, "Press Me", wxPoint(420, 30), wxSize(100, 30));
myButton->Bind(wxEVT_BUTTON, &MyFrame::OnHello, this);
Bind(wxEVT_MENU, &MyFrame::OnHello, this, ID_Hello);
Bind(wxEVT_MENU, &MyFrame::OnAbout, this, wxID_ABOUT);
Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT);
}
void MyFrame::OnExit(wxCommandEvent& event)
{
Close(true);
}
void MyFrame::OnAbout(wxCommandEvent& event)
{
wxMessageBox("This is a wxWidgets Hello World example", "About Hello World", wxOK | wxICON_INFORMATION);
}
void MyFrame::OnHello(wxCommandEvent& event)
{
//wxLogMessage("Hello world from wxWidgets!");
// wxCharts 라이브러리를 사용하여 막대 그래프를 생성
// Create the data for the bar chart widget
wxVector<wxString> labels;
labels.push_back("January");
labels.push_back("February");
labels.push_back("March");
labels.push_back("April");
labels.push_back("May");
labels.push_back("June");
labels.push_back("July");
wxChartsCategoricalData::ptr chartData = wxChartsCategoricalData::make_shared(labels);
// Add the first dataset
wxVector<wxDouble> points1;
points1.push_back(3);
points1.push_back(2.5);
points1.push_back(1.2);
points1.push_back(3);
points1.push_back(6);
points1.push_back(5);
points1.push_back(1);
wxChartsDoubleDataset::ptr dataset1(new wxChartsDoubleDataset("Dataset 1", points1));
chartData->AddDataset(dataset1);
// Add the second dataset
wxVector<wxDouble> points2;
points2.push_back(1);
points2.push_back(1.33);
points2.push_back(2.5);
points2.push_back(2);
points2.push_back(3);
points2.push_back(1.8);
points2.push_back(0.4);
wxChartsDoubleDataset::ptr dataset2(new wxChartsDoubleDataset("Dataset 2", points2));
chartData->AddDataset(dataset2);
// Create the column chart widget (Month가 X축에 표시됨)
wxColumnChartCtrl* columnChartCtrl = new wxColumnChartCtrl(panel, wxID_ANY, chartData);
columnChartCtrl->SetSize(400, 300);
// Set up the sizer for the panel
//wxBoxSizer* panelSizer = new wxBoxSizer(wxHORIZONTAL);
//panelSizer->Add(columnChartCtrl, 1, wxEXPAND);
//panel->SetSizer(panelSizer);
}

세로 막대 그래프는 wxColumnChartOptions::prt가 없어서 grid를 없애지 못한다. 아직 완전한 라이브러리는 아닌 것 같다.
라인 차트를 그려보자.
#include <wx/wx.h>
#include <wxcharts/wx/charts/wxchart.h> // wxchart.h 헤더 파일을 포함한다.
#include <wxcharts/wx/charts/wxlinechartctrl.h> // wxlinechartctrl.h 헤더 파일을 포함한다.
#pragma comment(lib, "wxchartsd.lib")
class MyApp : public wxApp
{
public:
bool OnInit() override;
};
wxIMPLEMENT_APP(MyApp);
class MyFrame : public wxFrame
{
public:
MyFrame();
private:
void OnHello(wxCommandEvent& event);
void OnExit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
wxPanel* panel;
};
enum
{
ID_Hello = 1
};
bool MyApp::OnInit()
{
MyFrame* frame = new MyFrame();
frame->Show(true);
return true;
}
// 메인 프레임의 위치(default position)와 크기(550x400)를 설정한다.
MyFrame::MyFrame() : wxFrame(nullptr, wxID_ANY, "Hello World", wxDefaultPosition, wxSize(550, 400))
{
wxMenu* menuFile = new wxMenu;
menuFile->Append(ID_Hello, "&Hello...\tCtrl-H", "Help string shown in status bar for this menu item");
menuFile->AppendSeparator();
menuFile->Append(wxID_EXIT);
wxMenu* menuHelp = new wxMenu;
menuHelp->Append(wxID_ABOUT);
wxMenuBar* menuBar = new wxMenuBar;
menuBar->Append(menuFile, "&File");
menuBar->Append(menuHelp, "&Help");
SetMenuBar(menuBar);
CreateStatusBar();
SetStatusText("Welcome to wxWidgets!");
panel = new wxPanel(this, wxID_ANY);
wxButton* myButton = new wxButton(panel, wxID_ANY, "Press Me", wxPoint(420, 30), wxSize(100, 30));
myButton->Bind(wxEVT_BUTTON, &MyFrame::OnHello, this);
Bind(wxEVT_MENU, &MyFrame::OnHello, this, ID_Hello);
Bind(wxEVT_MENU, &MyFrame::OnAbout, this, wxID_ABOUT);
Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT);
}
void MyFrame::OnExit(wxCommandEvent& event)
{
Close(true);
}
void MyFrame::OnAbout(wxCommandEvent& event)
{
wxMessageBox("This is a wxWidgets Hello World example", "About Hello World", wxOK | wxICON_INFORMATION);
}
void MyFrame::OnHello(wxCommandEvent& event)
{
wxVector<wxString> labels;
labels.push_back("2023-01-01");
labels.push_back("2023-01-02");
labels.push_back("2023-01-03");
labels.push_back("2023-01-04");
labels.push_back("2023-01-05");
wxChartsCategoricalData::ptr chartData = wxChartsCategoricalData::make_shared(labels);
wxVector<wxDouble> points;
points.push_back(3);
points.push_back(2.5);
points.push_back(1.2);
points.push_back(3);
points.push_back(6);
wxChartsDoubleDataset::ptr dataset1(new wxChartsDoubleDataset("Data", points));
chartData->AddDataset(dataset1);
// Create the line chart widget
wxLineChartCtrl* lineChartCtrl = new wxLineChartCtrl(panel, wxID_ANY, chartData, wxCHARTSLINETYPE_STRAIGHT, wxDefaultPosition, wxDefaultSize, wxBORDER_DEFAULT);
lineChartCtrl->SetSize(400, 300);
// Set up the sizer for the panel
//wxBoxSizer* panelSizer = new wxBoxSizer(wxHORIZONTAL);
//panelSizer->Add(lineChartCtrl, 1, wxEXPAND);
//panel->SetSizer(panelSizer);
}

timeseries 차트는 아직 구현이 제대로 된 것 같지 않다. 사용할 수가 없어 라인 차트를 만들어 본 것이다.
아직 제대로 된 튜토리얼이나 문서도 없다. 아래 샘플을 참고하자.
※ 참고
반응형
'C, C++' 카테고리의 다른 글
| [wxWidgets] Timer 타이머 (0) | 2026.05.10 |
|---|---|
| [wxWidgets] wxChartDir 차트 그리기 (0) | 2026.05.05 |
| [wxWidgets] Window Handle & Titlebar Icon 윈도우 핸들 구하기 및 타이틀바 아이콘 바꾸기 (0) | 2026.05.04 |
| [wxWidgets] wxFormBuiler XRC 파일 사용하기 (0) | 2026.05.03 |
| [wxWidgets] Build and Simple Example 빌드와 간단한 예제 (feat.OpenCV) (0) | 2026.05.03 |
