Due to popular request, a new use-case tutorial about adding tags to axes was authored. This is a nice opportunity to show what can be done with QCustomPlot's item system.
The tutorial can be found in the Special Use Cases section: Dynamic axis tags with items. The accompanying example project will be part of the QCustomPlot 2.0.1 release which will be published shortly.
The QCustomPlot version 2.0.0 release is finally available!
It brings plenty of new large and small features, some of which have already been introduced in the previous news posts. One of the features I'd like to highlight here is the new capability of QCPGraph to handle gaps in the data when a fill is specified, drawing multiple disjoint fill polygons as appropriate, even when in channel-fill mode – this was an addition in the beta phase:
Another highlight of QCP 2.0.0 is the new selection mechanism, which is detailed in the dedicated documentation page about the data selection mechanism. Further, the introduced unified data storage system for all 1D plottables, such as QCPGraph or QCPBars, offers much better performance both in terms of access/modification times and memory usage, compared with the old red-black-tree/QMap. It is based on the new template QCPDataContainer, which is explained in more detail in the documentation. Along with this, a unified interface to all 1D plottables is available in the form of QCPPlottableInterface1D.
A full list of all the changes and bugfixes can be found in the changelog.
The release of QCP 1.4.0 will follow shortly. It backports bugfixes and minor features from the 2.0.0 release that do not break backward-compatibility. This is for projects that need to stick with the 1.x.x version line but still want some of the QCP2 benefits.
I'm happy to announce the QCustomPlot version 2.0.0 beta phase has started!
Head over to the download section to get the latest packages.
During the beta, the QCP2 public interface isn't fixed yet, so feel free to report any issues or suggestions regarding that. The feature list is as long as never before, have a look at the changelog for a detailed description of major and minor changes. Users who wish to switch from QCP1.x to 2.0.0 should review the list of backward-incompatible changes in the changelog, to speed up the migration (although I recommend migration only after the end of the beta).
The documentation is up to date with QCP2, so you'll be able to work with the new interfaces smoothly. The website tutorials and the code behind the example images will be updated in the next few days.
QCustomPlot version 1.3.2 was just released which backports most bugfixes that were introduced in the QCP 2.0.0 branch and brings them to the 1.x.x branch. Have a look at the changelog to see whether you're potentially affected by one of the bugs and update as necessary. If more bugfixes are introduced during the 2.x.x branch which can be backported, there will be according patch releases for 1.x.x.
Head over to the download section to get the new packages!
QCustomPlot 2.0.0 is progressing well and it's time to talk about some of the new features. This news post is about the significantly improved mechanism of axis tick generation.
Up to now, you only had the choice between numerical ticks, date/time ticks, and fully custom ticks. Even worse, the date/time tick mechanism still used the numerical coordinate generator, not knowing about months/days/hours etc. so it didn't take into account that humans would like to for example have their year split into month intervals — even if that means having slightly inhomogeneous tick steps as months have different numbers of days. Same with hours, minutes and seconds based on 24, 60 and 60 instead of powers of ten.
This all changes with QCP2 introducing
QCPAxisTicker. This base class can be injected into an axis (
xAxis->setTicker(myAxisTicker)) and then controls both tick coordinates and associated labels. The axis ticker class can be subclassed easily and allows a fine-grained level of customization. You can reimplement just one method to change the behaviour in that specific respect, or all of them to take full control. It also keeps your custom tick code outside of your application (no more
ticksRequest slots in user code as before).
Above you can see what is possible with
QCPAxisTicker subclasses. These are the subclasses that will come with QCP2 by default. They cover:
The QCustomPlot 1.3.1 release is now available. Thanks to everyone reporting issues, quite a few things were fixed and improved.
If you are wondering why the full package is just half the size of the previous release: The build script now automatically optimizes and reduces the palettes of the documentation images to strip away quite a bit of their size. This translates directly into .qch file and package size reduction, improving download times (not that 0.5 secs would matter with today's connections) and server load (this matters ;).
The documentation got a major overhaul of its style
Now it looks more in line with the Qt5 documentation and is generally easier readable. It was also extended and improved here and there, especially regarding topics where I noticed confusion in the forum.
QCustomPlot version 1.3.0 was just released, head over to the download section to get the latest packages!
The exciting new features were presented in the previous news post about the beta release already. However, some new interesting features were added and minor bugs have been fixed since then, which you can check out in the changelog.
I'd like to highlight that QCustomPlot is now compatible with the Qt compilation flags
QT_NO_KEYWORDS (the latter after some automated changes to the source). The documentation page special-qt-flags explains this in greater detail. This makes it easier especially for professional projects which require the additional safety and cross-framework-compatibility provided by these flags.
The beta release for QCustomPlot version 1.3.0 is available:
One of the most interesting new features is the new
QCPFinancial plottable, which allows representation of financial/stock data with Candlesticks and OHLC charts:
Another highlight is the extension of the bar chart features, especially with the new
QCPBarsGroup class. It allows grouping multiple bars together at mutual keys.
There are many more new features, have a look at the changelog for a detailed list of changes. Please note that during the beta phase, the public interface of the introduced features isn't fixed yet. Please report any problems so they can be resolved in the 1.3.0 release.
A patch release 1.2.1 is available. It fixes a display problem with the date-time labels when the axis tick label type is
ltDateTime. You can find the packages in the download section.
I'm happy to announce that QCustomPlot 1.2.0 was just released. The beta phase went pretty smooth, a few bugs have been spotted and fixed. Thank you all for the feedback! Have a look at the changelog for the changes in 1.2.0-beta and now 1.2.0.
As mentioned, the most noticeable improvements are the adaptive sampling technique, which enormously improves performance for very large data sets. And of course, the color map is now in the repertoire of QCustomPlot. Have a look at the new plot example, which shows the dipole radiation pattern with a polar color theme:
Head over to the download section to get the QCustomPlot 1.2.0 packages!
If you don't want to miss future QCustomPlot releases, have a look at the new e-mail news feed service. You can subscribe your e-mail and receive notifications whenever a new QCustomPlot release, beta release or critical bug is published.
You can find the packages at
As announced in the previous news post, the two big features are the adaptive sampling of QCPGraph, and the new plottable QCPColorMap, with its QCPColorScale layout element. For a detailed list of the changes, have a look at the changelog.
In the beta phase, the interface is not fixed, so feedback is especially welcome.
Here's a little preview of the two most important features that QCustomPlot 1.2.0 will offer. The first one I've mentioned in the previous news already: Adaptive sampling will allow displaying high density data with high performance.
To give you some numbers: A line plot with 500 000 points can be fluidly handled on today's desktop machines. This not only means dragging but also zooming, rescaling etc., because QCustomPlot's new plotting technique doesn't rely on simple pixmap buffering. It maintains full flexibility in the process.
The second feature that I know many people will like is the color map:
QCP 1.2.0 will bring the new plottable QCPColorMap, together with a layout element QCPColorScale representing the gradient you see on the right, for correlating colors with a numerical scale. It was originally planned finishing the color map in a later release, but due to a special user request, I have decided to introduce it now.
Due to the feature richness of the 1.2 release, I will not release the final version mid january, but a beta. This way you have the opportunity to test it before the features and interfaces are fixed.
Please see the changelog for a list of the fixed bugs in this patch release.
The main feature of QCustomPlot 1.2.0 was also completed just today. It will bring a huge performance leap for applications that plot large amounts of data. A dedicated news about this will probably be posted before christmas. The 1.2.0 release itself is expected mid January. Stay tuned!
The release of QCustomPlot 1.1.0 is completed and can be found in the download section. Have a look at the changelog for a list of changes that have been made. Probably most notable is the internal switch from QWeakPointer to QPointer, because it gets rid of deprecated Qt functionality. This allows QCustomPlot to be compiled with Qt 5.1 and Qt 5.2 smoothly (although only the beta of Qt 5.2.0 was tested at the time of this writing).
I'd like to thank all the people discussing in the forum and giving feedback (or even diff patches) via email. Thanks!
QCustomPlot 1.0.1 was just released. The patch release fixes one bug and brings mostly improvements for the documentation. Especially the problems of missing images when viewing the QCP documentation with QtAssistant should be fixed now.
I'm happy to announce that QCustomPlot 1.0.0 was released on the first of August. The packages can be found in the download section. All changes that happened during the beta phase can be found in the changelog. A big thank you goes out to all the people discussing the QCP interface with me and reporting problems throughout the entire QCP history and especially the recent 1.0.0-beta phase. In particular I'd like to thank Mostafa, Pavel, Kwabena, Oleg and Pete.
From now on, QCP uses the semantic versioning scheme. This means that the major version number changes, when the public interface changes in a backward-incompatible manner. The minor version number changes for added features which are backward compatible in the public interface. And the patch (the rightmost) version number changes for backward compatible bugfixes and changes in peripheral files (e.g. documentation, compilation scripts, example codes, benchmarks, etc.)
Two new examples were added. One demonstrates the use of the new layout system to create complex plots with multiple axis rects and multiple axes per axis rect side. It's part of the plots example, and also shown in the screenshot section of the introduction page:
The other one accompanies the special use case tutorial Controlling the axis range with a scrollbar. It can be found in the full download package as scrollbar-axis-range-control in the examples directory.
The progress towards the 1.0.0 release is looking good, and the advanced axis rect tutorial was a part of it. Six bugs have been fixed and two requested features have been added in the beta phase so far. As I've mentioned in the forum, If nothing big comes up, QCP 1.0.0 will be released on the 1st of August.
Seeing what QCustomPlot has become, it's about time.
opens its gates! The website was completely built from scratch(*). In fact, a custom content management system is working in the background. This will allow quick and easy updates of the website, while giving much more performance and flexibility than the WordPress CMS used for the old one. The old website workslikeclockwork.com will stay online for the other small components, that don't reach the scale of QCustomPlot.
Since the comment section got quite crowded from time to time, I've also created a forum. It allows threaded discussions and a better overview of what's hot. In the next days and weeks, I'll be migrating the recent relevant comments from the old website to the forum.
(*) The first news post of the old website once promised I'd never build a website from scratch anymore, given what's possible with WordPress. Well, unfortunately I've reached its limits as quickly as it was set up...
QCustomPlot 1.0.0-beta is ready for public testing! You can find the packages in the download section.
In the beta phase, the public interface is not frozen, so suggestions for interface improvement are still very welcome for 1.0.0. After the beta phase, public interface changes that are backward-incompatible will only be introduced in the next major version (2.0.0). I am especially interested in people who use Qt 5.0.2 with MSVC, as I don't have this combination available for testing at the moment.
For people who plan switching to QCustomPlot 1.0.0 once it's final and have applications built on previous QCustomPlot versions, be aware that there are some source backward-incompatibilities. This was necessary because starting with the new versioning scheme, I wanted to get as many interface fixes/changes done before releasing 1.0.0. I have compiled a FAQ-Like list with questions that I believe might come up when porting from an old QCustomPlot version:
setPlotTitle is gone, how do I set a plot title now?
A plot title now is a layout element. You can add a title like this:
customPlot->plotLayout()->insertRow(0); // inserts an empty row above the default axis rect customPlot->plotLayout()->addElement(0, 0, new QCPPlotTitle(customPlot, "Your Plot Title"));
where did setupFullAxesBox, setRangeDrag, setMargin etc. go?
Many functions related to the axis rect moved to the QCPAxisRect class. You can reach the default axis rect via
customPlot->axisRect(). From there, you can use the functions like you used to.
enable/disable range zoom and drag?
By default, the
Drag are now set to
Qt::Horizontal|Qt::Vertical. To enable range zooming/dragging, all you need to do now is set the corresponding interaction flag:
customPlot->setInteractions(QCP::iRangeZoom | QCP::iRangeDrag);
where did setSelected/setSelectable on QCPAxis and QCPLegend go?
they're now called setSelectedParts/setSelectableParts reflecting the fact, that they don't handle a bool but an enum with multiple possible parts.
What happened to scatter styles and colors, for example on QCPGraph and QCPCurve?
They're now handled by QCPScatterStyle. When old code said
setScatterStyle(QCP::ssCircle), you now write
setScatterStyle(QCPScatterStyle::ssCircle). For more details what's behind that and the new possibilities, see the documentation of QCPScatterStyle.
For detailed changes, have a look at the changelog.txt. And of course, the documentation, which is in the first download package, is also up-to-date and thus can help you work with new and changed functionality.
If you have questions not adressed in the list, or feel that the list doesn't explain an issue in enough detail, please contact me via E-Mail (see contact page) or open a thread in the forum.
Here's a little sneak preview of the central thing the next release brings:
A major refactoring of the axis rect sytem now allows for much more flexible plots, with basically all the layout possibilities you already know from QWidgets and QLayout. All inside one QCustomPlot instance. You can also have multiple axes per side in one axis rect, when you really need to fit all the data you've got into one plot.
Can't say when the release is going to be finished yet, there still is lots of work to do. After all, it's going to be 1.0.0, so I'd better be careful ;). In case you're wondering, I will use the semantic versioning scheme. That means major versions change the public interface in a backward-incompatible manner, minor versions change the library without breaking backward compatibility and the rightmost number is for patch releases.
Yesterday night I finally finished the new QCustomPlot release which introduces, as promised, items!
You know, items, like arrows, text labels, rectangles, straight lines etc. to decorate the plot and emphasize or explain data. To introduce them, a short section was added to the online wlcw tutorial. As always, you'll get the most useful information from the documentation and the example codes. The base class
QCPAbstractItem is a good starting point.
Although Items are the big addition in this release, there are plenty of other new things worth mentioning:
QCPLayerdocs). This gives you a very convenient way to control the rendering order in the plot and organize your objects.
setAntialiasedfunction. The old function
setAntialiasedElementscan now be used to override the individual settings.
phFastPolylinesallows increasing the performance of graphs when they use solid lines and plot performance is more important than line-joint quality.
For a detailed listing of what has changed, what bugs were fixed and what code-compatibility issues may arise, see the changenotes.
The Qt plotting widget QCustomPlot now offers user interactions that go beyond range dragging: object selection and specific click signal emission for graphs, axes, legend, etc.! Additionally to the documentation (and the "user interactions" section of the website-tutorial), the new interactions-example in the QCustomPlot package explains this new feature.
Of course, a few minor changes here and there and a few bugfixes have made it into the release, too, see the changenotes for details.
The next release will probably finally include anchorable objects such as text/images/shapes/arrows. Exciting.