QCustomPlot 2.0.0 released!//September 4, 2017

The QCustomPlot version 2.0.0 release is finally available!

Visit the download section for the other packages.

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.

QCustomPlot 2.0.0 beta phase started//September 14, 2016

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 1.3.2 patch release//December 22, 2015

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!

QCP2 Feature Preview: Axis Tickers//October 31, 2015

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:

  • Fixed or integer multiples/powers of a given tick step
  • Logarithmic ticks, now with adaptive tick step using integer powers of the specified log base as effective log base
  • Ticks in terms of a symbolic constant (here pi) with natural fraction display
  • Custom text labels
  • Date/Time ticks which properly take into account calendar peculiarities such as (leap-)years, month days, etc.
  • Time span ticks in terms of days down to milliseconds, without absolute calendar information (bottom two examples in image above)
QCustomPlot 1.3.1 patch release//April 25, 2015

The QCustomPlot 1.3.1 release is now available. Thanks to everyone reporting issues, quite a few things were fixed and improved.

Head over to the download section to get the latest release. A detailed list of changes is in the changelog.

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 1.3.0 released//December 27, 2014

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_CAST_TO_ASCII, QT_NO_CAST_FROM_ASCII and 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.

QCustomPlot 1.3.0-beta available//October 11, 2014

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.

Patch release 1.2.1//April 7, 2014

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.

QCustomPlot 1.2.0 released!//March 14, 2014

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!

E-mail news feed//February 12, 2014

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.

QCustomPlot 1.2.0-beta released//January 28, 2014

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.

Preview of QCustomPlot 1.2.0//December 24, 2013

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.

Adaptive Sampling Preview

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:

Color Map Preview

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.

Fröhliche Weihnachten!

Patch release 1.1.1//December 9, 2013

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!

QCustomPlot 1.1.0 released//November 4, 2013

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!

Patch release 1.0.1//September 5, 2013

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.

The packages can be found in the download section. A detailed list of changes can be found in the changelog.

QCustomPlot 1.0.0 released//August 3, 2013

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.)

New examples added, approaching release//July 26, 2013

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.

New website!//July 7, 2013

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 here!//May 20, 2013

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 QCPAxisRect::setRangeZoom/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.

A little preview of 1.0.0...//October 8, 2012

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.

Sleep tight!


Big QCP release brings items and more//June 9, 2012

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:

  • Pretty much all visible objects on the plot are now "Layerables" and can be placed on layers (see QCPLayer docs). This gives you a very convenient way to control the rendering order in the plot and organize your objects.
  • The antialiasing is not controlled centralized for all objects of a category anymore, but each object has its own setAntialiased function. The old function setAntialiasedElements can now be used to override the individual settings.
  • In Qt 4.7 the drawing is now absolutely pixel precise due to a smart QPainter subclass that works around some Qt bugs. Of course this is most noticeable when having antialiased and non-antialiased objects side by side that need to line up (like error bars and scatter points). Unfortunately Qt 4.8 is very broken in this respect, so much that a workaround isn't possible.
  • Added more possibilities to improve performance. You may now specify that antialiasing is disabled while dragging axis ranges to improve responsiveness. Further the plotting hint phFastPolylines allows increasing the performance of graphs when they use solid lines and plot performance is more important than line-joint quality.
  • Shared library compilation and usage is now possible without additional work necessary. See the sharedlib package in the download section which demonstrates this, and the setup section in the online wlcw tutorial.

For a detailed listing of what has changed, what bugs were fixed and what code-compatibility issues may arise, see the changenotes.

Interactions!//April 1, 2012

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.

New QCustomPlot release//February 3, 2012

It's done!

Most significant new features:
Plottable-interface extends graph-interface and allows for future extension. In line with that come three new plot capabilities: Parametric curves, Bars and Statistical Box Plots. See the new section in the tutorial (above download section) and the documentation.
Further, Axes are now reversable.

Apart from that, the documentation was extended quite a bit. With the touched up main page, the new class descriptions and of course the member documentation, one should be able to learn using QCustomPlot even without reading the tutorial on the website.