MPAndroidChart 4.0.1
Fixes and small additions for MPAndroidChart 4.0. A drop-in update from 4.0.0: no API was removed or changed.
implementation("com.github.PhilJay.MPAndroidChart:MPChartLib:v4.0.1")
implementation("com.github.PhilJay.MPAndroidChart:MPChartCompose:v4.0.1") // only for Compose
- A tap inside a bar of a combined chart selects the bar instead of a nearby line point (#5207).
- In a bar chart whose grouped data sets use different y axes, a tap selects the bar that was touched (#5292).
- Limit line labels at the edge of the content area are no longer cut off (#5328).
- Auto scaling also rescales a y axis that is disabled (#5258).
- Charts can be built on a thread without a Looper, for example with an asynchronous layout inflater (#5241).
- The default value formatter no longer rebuilds its number format when the number of decimals stays the same (#5217).
YAxis.labelRotationAnglerotates the y axis labels (#5213).- Pie entry labels and values with a line break are drawn as several lines (#5205).
PieChart.isRoundedSlicesReversedrounds the slice ends the other way around (#5206).PieChart.isTransparentCircleClippedToSlicesdraws the translucent ring only over the slices, so the space between slices stays open (#5348).chart.toBitmap(width, height)draws a chart at any size, also one that was never laid out, for example to export an image (#4664).
The guides cover all additions, and CHANGELOG.md lists every change.
MPAndroidChart 4.0.0
MPAndroidChart 4.0 is here: the library rewritten from the ground up in Kotlin, with a Jetpack Compose module. It is the first stable release since 3.1.0.
📖 Guides and documentation: philjay.cc/mpandroidchart · 35 chapters from a first chart to theming, Compose, custom renderers and troubleshooting.
- Kotlin first. Properties instead of getter and setter pairs, lambdas for formatters and listeners (
chart.onValueSelected { entry, highlight -> }), typed entry payloads, lists instead of arrays. Java callers keep working. - Jetpack Compose. The new
MPChartComposemodule: a composable for every chart type,ChartStateto read and drive a chart, and markers written as composables. - Animated data changes.
animateDataChange(newData)moves every value smoothly to its new one, andanimateValue(entry, toY)animates a single value. Every animation takes anonEndcallback, andisAnimatingandstopAnimations()are new. In Compose,animateChanges = trueanimates new data automatically. - Empty and loading states. A modern empty state with an outline of the chart type instead of the old yellow text, and
isLoadingfor data that is still on its way. Everything about it can be customized. - New styling. Rounded bars and stacked sections, rounded radar corners, a ring around the highlighted point, and highlight lines that can stop at the entry.
- Robust. Tested against NaN, Infinity, empty data and 100,000 entries, inside
RecyclerViewandLazyColumn, across rotation and with leak checks. More than 40 reported issues are fixed.
- Lines draw about 1.2x faster than in 3.1.0, and bars 1.6x faster with the new
isDecimationEnabled, which drops entries that share a pixel column. - A zoomed-in bar chart builds only the bars on screen: 2.5 ms per frame with 500 bars in view, whether the data holds 10,000 or 300,000.
- Line circles that would cover each other are skipped, and crowded candles are thinned out, so 100,000 entries draw in well under a second with default settings.
The performance chapter has all measurements.
// settings.gradle.kts
dependencyResolutionManagement {
repositories {
maven("https://jitpack.io")
}
}
// build.gradle.kts
dependencies {
implementation("com.github.PhilJay.MPAndroidChart:MPChartLib:v4.0.0")
implementation("com.github.PhilJay.MPAndroidChart:MPChartCompose:v4.0.0") // only for Compose
}
minSdk 23 · compileSdk 35 (37 for Compose) · Java 17 · Kotlin 2.0 or newer. The getting started guide takes you from here to a first chart.
- From 3.x: class, package and interface names are unchanged, so imports survive and call sites change. The migration guide and MIGRATION.md cover every step. Projects on the 3.x coordinates keep building untouched.
- Staying on 3.x? Nothing changes for you. 3.2.0 is the last Java release with every fix from 3.x; coming from 3.1.0 it needs small formatter changes, which its notes list. The code lives on the
3.xbranch. - From 4.0.0-beta01: scatter shape sizes and
ComposeMarker.offsetare now in dp,centerTextSizePixelsis gone,PieData.dataSetis nullable andLargeValueFormatter.suffixis a list.
CHANGELOG.md lists every change. Thanks to everyone who reported issues and sent pull requests over the years.
Version 3.2.0
The last release of the Java 3.x line. It packages everything merged into master since 3.1.0 as a stable, pinned version.
implementation 'com.github.PhilJay:MPAndroidChart:v3.2.0'
Same coordinates as before, Java API, minSdk 14.
- On
master-SNAPSHOTor a recentmastercommit: yes, switch tov3.2.0now. It is exactly the code you use today, andmastermoves to the Kotlin rewrite with 4.0.0. - On 3.0.x: yes. The formatter API is the same as in 3.0.x, and you get the fixes and additions below.
- On 3.1.0: only if you are ready to adjust your formatters. 3.2.0 goes back to the formatter interfaces of 3.0.x, so code that extends
ValueFormatterno longer compiles (see below). Staying on 3.1.0 is fine, and 4.0.0 is the way forward.
ValueFormatteris gone. ImplementIValueFormatterfor values andIAxisValueFormatterfor axes instead, as in 3.0.x:xAxis.setValueFormatter((value, axis) -> "M" + (int) value); dataSet.setValueFormatter((value, entry, dataSetIndex, viewPortHandler) -> value + " kg");
PercentFormatter(PieChart)is replaced bynew PercentFormatter()together withpieChart.setUsePercentValues(true).- Gradients moved to bars.
setGradientColor(start, end)andsetGradientColors(...)now live onBarDataSet, wheresetGradientColorstakesFillobjects;getGradientColor()becomesgetFill(index). IPieDataSet.isUsingSliceColorAsValueLineColor()is nowisUseValueColorForLineEnabled().- Custom renderers:
drawValuereceives the formatter and entry again:drawValue(Canvas, IValueFormatter, value, entry, dataSetIndex, x, y, color).
Fillfor bar colors: solid colors, gradients and drawables, viaBarDataSet.setFills(...).GradientColorremains as a deprecated subclass ofFill.- Combined charts:
highlightValue(x, dataSetIndex, dataIndex)highlights an entry inside one of the combined data objects. - Pie charts:
PieDataSet.setHighlightColor(...), andsetUseValueColorForLine(true)to draw each value line in its slice color. - Axes:
setAxisMinLabels/setAxisMaxLabelsto change the allowed label count range, andYAxis.setLabelXOffset(...). - Drawing:
setClipDataToContent(false)lets data draw outside the content rectangle. - No data text:
setNoDataTextAlignment(...)aligns it left, center or right. - Data sets:
getEntries()/setEntries()replacegetValues()/setValues(), which stay as deprecated aliases. - Filtering:
ApproximatorN.reduceWithDouglasPeucker(points, resultCount)reduces a line to a target number of points.
- A crash with solid colors in bar charts (#4802).
- An index out of bounds crash in stacked bar charts.
- Axis labels that disappeared while zooming in, and a race around the label interval.
- A pie slice without highlight enabled was hidden when highlighted.
- An unexpected dashed line during linear line animations.
- Bubbles drawn with the color of the wrong entry, and the wrong axis used for legend spacing in horizontal bar charts.
- The axis dependency is now respected in combined charts, and horizontal bar charts get correct negative offsets.
onChartScaleis now called after a double tap zoom.- The legend height now includes its last line of labels.
- Clearing a data set now resets its min and max.
- The project builds with current Android Studio versions (#5456).
MPAndroidChart 4.0.0 follows right after this release: a complete rewrite in Kotlin with a Jetpack Compose module, new coordinates and extensive guides at philjay.cc/mpandroidchart. Projects on 3.x are not affected until they choose to migrate, and the migration guide walks through every step. The 3.x code stays available on the 3.x branch.
Thanks to everyone who contributed fixes and features to 3.x: @danielgindi, @oatrice, @duchampdev, @UrielFrankel, @nathan-fiscaletti and many others.
4.0.0-beta01
MPAndroidChart is back, rewritten from the ground up in Kotlin, with a Jetpack Compose module and documentation to match.
A Kotlin API that feels like Kotlin. Every getter and setter pair is a property, boolean flags read isXxxEnabled, and formatters and listeners are functional interfaces, so a lambda is enough: chart.onValueSelected { entry, highlight -> }. Colors, labels and draw orders are lists instead of arrays, entries carry a typed payload, and notifyDataSetChanged() alone recalculates and redraws.
Jetpack Compose. A new MPChartCompose module: one composable per chart type, ChartState for reading and driving a chart from Compose, and ComposeMarker for markers written as composables.
Faster with large data. Bars are clipped to the viewport, points are reduced to what a pixel column can actually show, entry lookup goes through the x value instead of walking the set, and the shared object pools no longer grow on every frame.
New styling. Rounded bars and rounded corners on every section of a stacked bar, rounded polygon corners on radar charts, a ring and halo around the highlighted point of a line chart, and highlight lines that can stop at the entry instead of crossing the whole chart.
Sharper axes and labels. X axis labels keep a label's width apart instead of overlapping, value labels are decided per data set from what is actually in view, and forced labels respect the axis granularity.
More than 40 reported issues fixed, plus six community pull requests ported. CHANGELOG.md has the full list.
Documentation. 35 chapters of guides at philjay.cc/mpandroidchart/docs, KDoc on every public class, function and property, and a generated API reference for MPChartLib and MPChartCompose.
// settings.gradle.kts
dependencyResolutionManagement {
repositories {
maven("https://jitpack.io")
}
}
// build.gradle.kts
dependencies {
implementation("com.github.PhilJay.MPAndroidChart:MPChartLib:v4.0.0-beta01")
implementation("com.github.PhilJay.MPAndroidChart:MPChartCompose:v4.0.0-beta01") // only for Compose
}
minSdk 23, compileSdk 35, Java 17 and Kotlin 2.0 or newer. Java callers need no Kotlin at all. The Compose module needs compileSdk 37, because Compose itself does.
The class, package and interface names are unchanged, so imports survive and the call sites change. MIGRATION.md lists every change with before and after code, and the migration guide walks through them.
Nothing here disturbs an existing project: 4.0 publishes under a new coordinate, so com.github.PhilJay:MPAndroidChart:v3.1.0 keeps resolving exactly as it does today, and master still carries the 3.x sources.
The API can still change before 4.0.0, so pin this version rather than tracking the newest one. Feedback and bug reports are very welcome.
Version 3.1.0
This mostly includes bug fixes, but with a few notable differences. The biggest change is bumping MPAndroidChart's minSdkVersion to 14. If you have a lower version, you should stop supporting it and go up to 14 as well.
Please see the current distribution usages, as less than 1% of Android devices are running versions 15 and lower now.
minSdkVersionhas been bumped to14, read the above.Easingclass has been simplified, old methods of getting easing functions are DEPRECATED (35c9fc937ecda0dd2eb1a7b879aa869a48bfad3d)Chart.saveToGallery(name, quality)now saves as a PNG instead of JPG (d67ea48)
- Upgraded project to
androidX, maven upgraded to2.1, gradle upgraded to4.6, android gradle to3.2.1, android build tools to28.0.3 - Example project has been refreshed (d67ea481af1e8528c617dfd404d0c7827b0134b2, 5030b36c86cfa2d076bb6b86fa8fcb37ce58557f)
- Grid lines can be drawn behind or infront of data (c97b8d531d5584b767d0587805c1c95018cf92d6)
- Can use pie slice color for value line color (1e6e58d2c026be332d6756b04d85b33cd3d36c2b)
- BarChart supports gradient colored bars (e4ba3cdc20555b5f7cd793e614ee13406a7605ec)
- Zoom animations fixed (6c54f0b0a91ca87fe39dd63d9095e4f55d6c59ff)
- Many rendering bugs fixed (43ae497ecf7427587687945496c6a70e65f01fcb, aee6058dbb74f4eb1aae8e88c7562d28a91e1e1c, 92c14db5b4de4efd43c9fd74361886b92111ca9f, 89436221db3d83991f9ecd830f871d4ce7da47a4)
- Copying data sets fixed (7abc9cd6696f78c77068ffc278793594b33497fe)
Version 3.1.0 pre-release
This is a pre-release, which means it's not fully tested. However, many bugs have still been fixed and I highly recommend that you update anyway to get those latest changes. Please open an issue if you are still running into issues with this release so they can be patched up for the final 3.1 release!
This mostly includes bug fixes, but with a few notable differences. The biggest change is bumping MPAndroidChart's minSdkVersion to 14. If you have a lower version, you should stop supporting it and go up to 14 as well.
Please see the current distribution usages, as less than 1% of Android devices are running versions 15 and lower now.
minSdkVersionhas been bumped to14, read the above.Easingclass has been simplified, old methods of getting easing functions are DEPRECATED (35c9fc937ecda0dd2eb1a7b879aa869a48bfad3d)Chart.saveToGallery(name, quality)now saves as a PNG instead of JPG (d67ea48)
- Upgraded project to
androidX, maven upgraded to2.1, gradle upgraded to4.6, android gradle to3.2.1, android build tools to28.0.3 - Example project has been refreshed (d67ea481af1e8528c617dfd404d0c7827b0134b2, 5030b36c86cfa2d076bb6b86fa8fcb37ce58557f)
- Grid lines can be drawn behind or infront of data (c97b8d531d5584b767d0587805c1c95018cf92d6)
- Can use pie slice color for value line color (1e6e58d2c026be332d6756b04d85b33cd3d36c2b)
- BarChart supports gradient colored bars (e4ba3cdc20555b5f7cd793e614ee13406a7605ec)
- Zoom animations fixed (6c54f0b0a91ca87fe39dd63d9095e4f55d6c59ff)
- Many rendering bugs fixed (43ae497ecf7427587687945496c6a70e65f01fcb, aee6058dbb74f4eb1aae8e88c7562d28a91e1e1c, 92c14db5b4de4efd43c9fd74361886b92111ca9f, 89436221db3d83991f9ecd830f871d4ce7da47a4)
- Copying data sets fixed (7abc9cd6696f78c77068ffc278793594b33497fe)
Gradle updates
Bump compile & target SDK, gradle changes.
Bugfixing & Stability Improvements
This release includes bugfixes and minor changes that came up over the past weeks.
Stability Improvements
This release improves stability and fixes bugs.
New major release
This is a major release, with a few breaking changes. So please pay attention.
Updates:
- The Integer
x-indexis dead. Intoducing: x-values (float). Each entry now has anxand ay. - Pie/radar charts do not have a concept of X index anymore
- Unified XAxis/YAxis features and experience.
- Unified formatter interfaces for axes.
- Major refactoring of the Highlight mechanism.
- Refactored marker mechanism
- Refactored legend entry mechanism
- Each dataset can now set its own legend form/size/etc.
- More demos
- Many minor bug fixes and improvements
Breaking changes / how to migrate:
- All dataset constructors have changed - they do not take an array of x-indices anymore.
- All entry constructors have changed - they take in an X and a Y.
- Pie and Radar chart entries now have their own classes. So exchange the Entry classes with
PieEntry/RadarEntry - If you have any old
startAtZeroEnabledcalls - these have been deprecated for a long time. Replace them withaxisMinimum. - In general, all functions that accepted x-indices before, now accept an x-value, so you might have to adjust the names a little bit.
- Where
OnChartValueSelectedListeneris implemented, update theonValueSelectedinterface - Replace
drawSliceTextEnabledwithdrawEntryLabelsEnabled - If you have a custom scatter shape - implement an
IShapeRenderer, and put your rendering code in there - If you have a custom marker - consider subclassing
MarkerView/MarkerImageor implementingIMarker. There are more options than before now... - If you have used
barSpacebefore, move to usingbarWidth