LINUX.ORG.RU

QCustomPlot 1.1.0

 , , , ,


2

5

4 ноября 2013 года вышла версия 1.1.0 библиотеки для построения двухмерных графиков (и не только) для Qt/C++. Главное изменение в новой версии — поддержка Qt 5.1 и 5.2 (beta1).

QCustomPlot — это достаточно молодая, но уже достаточно зрелая библиотека, позволяющая производить построение графиков как являясь частью интерфейса приложения (в качестве виджета или элемента QTextDocument), так и с выводом в файл (поддерживаются растровые и векторные форматы). Библиотека является довольно производительной и хорошо подходит для обновления графиков из поступающих в реальном времени данных.

QCustomPlot развивается активнее, чем свой прямой конкурент Qwt, и хотя ещё и не доросла до неё по функционалу, но подаёт очень большие надежды.

Основным разработчиком QCustomPlot является немец Emanuel Eichhammer. Библиотека распространяется под лицензией GPLv3, но автор упоминает возможность распространения под другими условиями с его персонального разрешения (например, под LGPL).

Сайт проекта

Документация

>>> Список изменений

★★★★★

Проверено: mono ()
Последнее исправление: mono (всего исправлений: 1)

Да, минорщина, но новостей про эту либу ещё не было. Я её активно использую в некоторых своих проектах. Отличная вещь.

Obey-Kun ★★★★★
() автор топика

Выглядит очень неплохо. Стильно, модно, современно

yoghurt ★★★★★
()

мммм, смак. спасибо

dib2 ★★★★★
()

Пользовался. Супер!

Но смущает что нет репозитория. Даже автору написал - он два года назад обещал еще...

I-Love-Microsoft ★★★★★
()

поддержка Qt 5.1 и 5.2 (beta1).

а где они используются?

snaf ★★★★★
()

Очень интересно. А есть какие-нибудь дополнительные вкусности по сравнению с qwt? Ну кроме отсутствия неподъёмного qt3 наследия.

ZhAN ★★
()
Ответ на: комментарий от skvitek

Графики это что-то очень ненужное, ага. Может быть лучше ты сам пойдёшь и займёшься работой?

anonymous
()
Ответ на: комментарий от skvitek

«кутешники» как раз занимаются самыми что ни на есть правильными делами. А именно: предоставляют либы для девелоперов на все случаи жизни, дабы те, в свою очередь, делали годные программы на все случаи жизни. Проблема пока, что в девелоперах.

t500s ★★★
()

Хорошие сегодня новости, то qbs зарелизили, то новая годная билиотека.

AF ★★★
()
Ответ на: комментарий от AF

Ну она не такая уж и новая. Выход из бета-стадии случился всего 3 месяца назад, но вообще она в конце 2011 года появилась.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

Я только сегодня о узнал, так что для меня новая!
Да, и 3 месяца - детский срок.

Пока радует, что можно много шкал по осям делать, ну и выглядит симпатично.

AF ★★★
()

выглядит красиво, но зачем данные то копировать? qwt вон умеет данные по указателю брать…

anonymous
()

QCustomPlot развивается активнее, чем свой прямой конкурент Qwt, и хотя ещё и не доросла до неё по функционалу, но подаёт очень большие надежды.

Может лучше было с Qwt помочь? Или есть принципиальные различия?

GladAlex ★★★★★
()
Ответ на: комментарий от GladAlex

Ну скриншоты выглядят много красивее и функциональнее Qwt - позитивно! :)

GladAlex ★★★★★
()
Ответ на: комментарий от GladAlex

Иногда лучше просто начать с нуля.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Тем, что копировать не обязательно, если использовать QCPGraph::setData(data, true). Да даже если и нельзя бы было так делать, не стоит забывать про implicit sharing.

Obey-Kun ★★★★★
() автор топика
Последнее исправление: Obey-Kun (всего исправлений: 2)
Ответ на: комментарий от Obey-Kun

во первых, если true, то как раз будет копировать… во вторых я все равно не вижу как мне передать данные из допустим QVector<double> x и QVector<double> y не копируя их…

anonymous
()

Че-то она тормозная какая-то. Я рисовал данные пришедшие с ацп, Qwt рисует влет хоть 100к точек, а QCustomPlot задумывается уже на 20к.

oh-la-la
()
Ответ на: комментарий от oh-la-la

Антиалиасинг пробовал вырубать?

Олсо в таких ситуациях кошерно применять map/reduce (ну или как там это называется — в общем, сокращение числа точек).

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Хм, а ты прав. Чёрт его знает, но думаю, что оптимизация ещё будет, всё же либа довольно молодая. Но как бы там ни было, копирование данных — ничто по сравнению с собственно рисованием.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

implicit sharing это бесспорно правильно и круто, да вот только у меня из числодробилки результаты в std::vector<double> приходят. Так шо не все так гладко.

AF ★★★
()

cat uporin.cpp

#include <QApplication>
#include"qcustomplot.h"
#include"math.h"

#define Q 8

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	QCustomPlot customPlot;

	QVector<double> x(Q+1), y(Q+1); // initialize with entries 0..100
	for (int i=0; i<Q+1; ++i)
	{
		x[i] = cos(2*M_PI*(i+0.5)/Q);
		y[i] = sin(2*M_PI*(i+0.5)/Q);
	}
	// create graph and assign data to it:
	customPlot.addGraph();
	customPlot.graph(0)->setData(x, y);
	// give the axes some labels:
	customPlot.xAxis->setLabel("x");
	customPlot.yAxis->setLabel("y");
	// set axes ranges, so we see all data:
	//customPlot.xAxis->setRange(-1, 1);
	//customPlot.yAxis->setRange(-1, 1);
	customPlot.rescaleAxes();
	//customPlot.graph(0)->rescaleAxes();
	customPlot.setMinimumSize(400,400);
	customPlot.show();
	return a.exec();
}
Чё за хрень? Хорошо попытка нумер 2. cat uporin2.cpp
#include <QApplication>
#include"qcustomplot.h"
#include"math.h"

#define Q 8

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	QCustomPlot customPlot;
	QCPCurve *cur = new QCPCurve(customPlot.xAxis, customPlot.yAxis);
	customPlot.addPlottable(cur);

	QVector<double> x(Q+1), y(Q+1); // initialize with entries 0..100
	for (int i=0; i<Q+1; ++i)
	{
		x[i] = cos(2*M_PI*(i+0.5)/Q);
		y[i] = sin(2*M_PI*(i+0.5)/Q);
	}
	// create graph and assign data to it:
	cur->setData(x, y);
	// give the axes some labels:
	customPlot.xAxis->setLabel("x");
	customPlot.yAxis->setLabel("y");
	// set axes ranges, so we see all data:
	customPlot.axisRect()->setupFullAxesBox();
	customPlot.rescaleAxes();
	customPlot.setMinimumSize(400,400);
	customPlot.show();

	return a.exec();
}

Вывод: к энтерпрайзу готов.

FriendshipIsMagic
()

Кстати, ктонибудь в курсе что за amalgamate он использует?

FriendshipIsMagic
()
Ответ на: комментарий от Obey-Kun

Для Ъ.

Ожидаю увидеть восьмиугольник. В первом случае QCustomPlot делает что? Правильно, сортирует данные по возрастанию x, гениально я щитаю.

Автор правда предлагает средство для обхода такого безобразия, используем во втором примере, восьмиугольник успешно нарисован, только вот незадача, регион для рисования криво выбран, врезультате горизонтальные и вертикальные линии отсутствуют и от фигуры остаются только наклонные отрезки по углам. QWT, кстати, в подобной ситуации отступает на 5 или около того пикселей и рисует все нормально.

FriendshipIsMagic
()

[troll mode] И что только народ не делает, лишь бы gnuplot не осваивать. [/troll mode]

А по смыслу: я так и не понял, оно в какие форматы сохранять умеет? eps, pdf?

Const
()
Ответ на: комментарий от Const

PDF. Плюс растровые (png, bmp, ...).

QCustomPlot can export to various formats such as vectorized PDF files and rasterized images like PNG, JPG and BMP. All outputs look identical and the generated PDF files can be imported and edited by vector editors like Inkscape, without trouble.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от intelfx

Это типичная модель распространения проприетарных библиотек, когда предлагаются два версии — GPL (желательно v3, т.к. он самый огороженный) и нормальный коммерческий вариант за $$. Напомню, что GPLv3 не является приемлемой не только для проприетарных программ, но и для большинства свободных проектов, т.к. их лицензии с GPLv3 не совместимы.

trycatch ★★★
()

Вот бы кто взял да прикрутил эту штуку к qBittorrent для отображения графиков скорости скачивания\раздачи.

azure ★★
()
Ответ на: комментарий от trycatch

Напомню, что GPLv3 не является приемлемой не только для проприетарных программ, но и для большинства свободных проектов, т.к. их лицензии с GPLv3 не совместимы.

Юзаю в in-house софтине, которую не собираюсь никому распространять (как и исходники), вполне доволен.

annulen ★★★★★
()
Ответ на: комментарий от Const

gnuplot строит хорошие графики, но они не такие красивые получаются. Впрочем, MathGL всех уделывает. Ну и ежели эта библиотека интерактивность даёт, то она может применяться в программах вроде qtiplot, но там уже используется qwt.

Quasar ★★★★★
()
Ответ на: комментарий от Quasar

По поводу красоты графиков можно поспорить. Особенно, когда это график не для аффективноманагерской презентухи, а для статьи в нормальном журнале.

Но прикол в другом: для графиков на плоскости инструментов — вагон. И притом продолжают новые изобретать. А вот для отображения данных в объёме… фактически только MathGL и есть.

Const
()
Ответ на: комментарий от Const

Но прикол в другом: для графиков на плоскости инструментов — вагон. И притом продолжают новые изобретать. А вот для отображения данных в объёме… фактически только MathGL и есть

http://qwtplot3d.sourceforge.net/

upd: а, так оно дохлое...

Obey-Kun ★★★★★
() автор топика
Последнее исправление: Obey-Kun (всего исправлений: 2)
Ответ на: комментарий от Obey-Kun

Тоже не то. Поверхности. То есть, фактически f(x,y). Это и гнуплот нормально делает, и matplotlib, и прочая. Сравните, например, с http://mathgl.sourceforge.net/doc_en/Surf3-sample.html#Surf3-sample или http://mathgl.sourceforge.net/doc_en/Dens3-sample.html#Dens3-sample Вот тут честные данные в объёме — f(x,y,z)

Добавлю. Кроме всего прочего, Алексей организовал в MathGL поддержку такой прорвы языков, включая и независимый скриптовый, что инструмент получился почти идеальный на мой вкус.

Const
()
Последнее исправление: Const (всего исправлений: 1)
Ответ на: комментарий от Const

Возможно. А к нему можно без изврата и тормозов прикрутить, скажем, перетаскивание итемов или, скажем, перемещение по плоскости мышкой?

С QCustomPlot у меня перетаскивание итемов мышкой сделать получилось очень просто и без проблем (http://stackoverflow.com/questions/19817885/qcustomplot-interact-with-a-singl...).

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

Честно, — не понял, что вы имеете в виду. Видимо, причина в различии областей деятельности. Мне ничего не надо перетаскивать. Обычно мне надо заготовить общий вид рисунка (поворот осей, подписи, обозначения, цветовая гамма, отображаемые величины), после чего в массовом порядке, лучше всего — автоматически, получать необходимое множество изображений.

MathGL (как и gnuplot, и matplotlib, кстати) хороши в том плане, что можно все эти действия производить на стороне сервера, вообще не привлекая графическую среду в момент обработки данных. Потом забрать изображения, или видеоролик и использовать их по назначению.

С другой стороны, хотя и первый мой текст в обсуждении был тролльский, я специально это пометил. Потому что — даёшь больше хороших и разных инструментов!

Const
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.