- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
例如,我有如下数据集:
val dataSetX = {101, 205, 210, 445, 505}
val dataSetY = {50, 100, 150, 200, 250}
图表 x 轴上的标签将为 101、205、295、445、505。
但我希望它们是 100,200,300,400,500,而不更改数据。
我该怎么办?
最佳答案
为了能够独立于数据输入列表呈现自定义标签,您需要实现自定义 XAxisRenderer
并覆盖函数 fun drawLabels(c: Canvas?, pos: Float, anchor : MPPointF?)
当标签准备好在 Canvas
上绘制时调用。默认实现使用 mXAxis.mEntryCount
和 mXAxis.mEntries
来呈现由库内部计算的 xAxis 中的标签。您可以做的是在不调用 super.drawLabels(c, pos, anchor)
方法的情况下通过覆盖它来修改父类(super class)实现,并进行处理自定义标签所需的调整。下面我将介绍如何实现这一目标。
1.) 首先声明从 XAxisRenderer
扩展而来的 CustomXAxisRenderer
,如下例所示:
class CustomXAxisRenderer(viewPortHandler: ViewPortHandler?, xAxis: XAxis?, trans: Transformer?, renderXArray : Array<Float>, formatter: ValueFormatter)
: XAxisRenderer(viewPortHandler, xAxis, trans) {
private val xArray : Array<Float>
private val xValueFormatter: ValueFormatter
init {
xArray = renderXArray
xValueFormatter = formatter
}
override fun drawLabels(c: Canvas?, pos: Float, anchor: MPPointF?) {
//don't call the super class to draw the default x points
//super.drawLabels(c, pos, anchor)
val labelRotationAngleDegrees = mXAxis.labelRotationAngle
val centeringEnabled = false//mXAxis.isCenterAxisLabelsEnabled
val positions = FloatArray(xArray.size * 2)
for(i in positions.indices step 2){
// only fill x values
if (centeringEnabled) {
positions[i.toInt()] = mXAxis.mCenteredEntries[(i / 2).toInt()]
} else {
positions[i.toInt()] = xArray[(i / 2).toInt()]
}
}
mTrans.pointValuesToPixel(positions)
for(i in positions.indices step 2){
var x = positions[i]
if (mViewPortHandler.isInBoundsX(x)) {
val label = xValueFormatter.getAxisLabel(xArray[i / 2], mXAxis)
if (mXAxis.isAvoidFirstLastClippingEnabled) {
// avoid clipping of the last
if (i / 2 == xArray.size - 1 && xArray.size > 1) {
val width = Utils.calcTextWidth(mAxisLabelPaint, label).toFloat()
if (width > mViewPortHandler.offsetRight() * 2 && x + width > mViewPortHandler.chartWidth)
x -= width / 2
// avoid clipping of the first
} else if (i == 0) {
val width = Utils.calcTextWidth(mAxisLabelPaint, label).toFloat()
x += width / 2
}
}
drawLabel(c, label, x, pos, anchor, labelRotationAngleDegrees)
}
}
}
}
2.)然后你可以像下面这样使用它:
//prepare an Array of the x points to render independent of the x points in the Data Entry List
//below values must be between AxisMinimum and AxisMaximum
val renderXArray = arrayOf<Float>(0f, 150f, 250f, 350f, 400f, 433f, 505f)
//and set a custom XAxisRenderer
chart.setXAxisRenderer(CustomXAxisRenderer(chart.getViewPortHandler(), chart.getXAxis(), chart.getTransformer(YAxis.AxisDependency.LEFT), renderXArray, object : ValueFormatter() {
override fun getFormattedValue(value: Float): String {
return value.toInt().toString()
}
}))
如果您需要根据值返回特定的标签字符串,您可以使用 ValueFormatter
,如下所示:
chart.setXAxisRenderer(CustomXAxisRenderer(chart.getViewPortHandler(), chart.getXAxis(), chart.getTransformer(YAxis.AxisDependency.LEFT), renderXArray, object : ValueFormatter() {
override fun getFormattedValue(value: Float): String {
return when (value) {
0f -> "A"
150f -> "B"
250f -> "C"
350f -> "D"
400f -> "E"
433f -> "F"
505f -> "G"
else -> ""
}
}
}))
完整示例:
chart = findViewById<LineChart>(R.id.chart)
//set xAxis properties
val xAxis = chart.xAxis
xAxis.setDrawLabels(true)
xAxis.setDrawAxisLine(true)
xAxis.setDrawGridLines(true)
xAxis.position = XAxis.XAxisPosition.BOTTOM
xAxis.axisLineWidth = 1.5f
//set xAxis Min/Max and Granularity
xAxis.setAxisMinimum(0f)
xAxis.setAxisMaximum(505f)
xAxis.setGranularity(1f)
xAxis.setGranularityEnabled(true)
//set axisLeft properties
val axisLeft = chart.axisLeft
axisLeft.setDrawLabels(true)
axisLeft.setDrawGridLines(true)
axisLeft.setDrawZeroLine(true)
axisLeft.axisLineWidth = 1.5f
axisLeft.setDrawTopYLabelEntry(true)
//set axisRight properties
val axisRight = chart.axisRight
axisRight.setDrawLabels(false)
axisRight.setDrawGridLines(false)
axisRight.setDrawZeroLine(false)
axisRight.setDrawAxisLine(false)
//prepare the Entry points
val values: ArrayList<Entry> = ArrayList()
values.add(Entry(101f, 50f))
values.add(Entry(205f, 100f))
values.add(Entry(210f, 150f))
values.add(Entry(445f, 200f))
values.add(Entry(505f, 250f))
//set the LineDataSet
val set1 = LineDataSet(values, "")
set1.setDrawCircles(true);
set1.setDrawValues(true);
//prepare LineData and set them to LineChart
val dataSets: ArrayList<ILineDataSet> = ArrayList()
dataSets.add(set1)
val data = LineData(dataSets)
chart.setData(data)
chart.getDescription().setEnabled(false);
chart.legend.isEnabled = false
//prepare an Array of the x points to render independent of the x points in the Data Entry List
//below values must be between AxisMinimum and AxisMaximum
val renderXArray = arrayOf<Float>(0f, 150f, 250f, 350f, 400f, 433f, 505f)
//and set a custom XAxisRenderer
chart.setXAxisRenderer(CustomXAxisRenderer(chart.getViewPortHandler(), chart.getXAxis(), chart.getTransformer(YAxis.AxisDependency.LEFT), renderXArray, object : ValueFormatter() {
override fun getFormattedValue(value: Float): String {
return value.toInt().toString()
}
}))
值结果:
标签结果:
注意:这是使用版本 'com.github.PhilJay:MPAndroidChart:v3.1.0'
关于android - 如何使用 mpchart 设置 xAxis 显示独立于条目的特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67667952/
有没有办法在图表中的最后一个标绘点上放置一个图标? 我需要得到这样的东西: 我应该使用 MarkerView 并强制突出显示所需的点吗? 提前致谢,再见! 最佳答案 只需使用 custom marke
有没有办法为饼图添加描边?我想要在我所有的切片上进行描边,不仅在外面而且在里面。我在库中没有看到任何方法。任何帮助将不胜感激。 最佳答案 我认为库中没有为此提供的 API。所以我最终修改了库。我用 S
我正在为我的 android 项目使用 MP 图表库。我正在创建具有负值的 CombinedChart(条形图和折线图)。图表即将出现,但是当我增加 X 轴上的值数量时,条形宽度会减小以适应这些值。
所以我目前正在使用 PhilJay ( https://github.com/PhilJay/MPAndroidChart ) 的 MPChart 库,但是我在 x 轴上滚动时遇到了一些问题,因为当我
我定制了一个折线图,它看起来正是我想要的。但是在关闭轴标签和线后,我无法从它左边删除填充。设置 chart.setViewPortOffsets(0f, 0f, 0f, 0f); 有帮助,但它没有完全
在我使用 Objective-C 的 iOS 应用程序中,我使用了 Charts用于实现图表的库,但我需要增加 x 轴线和标签(在图像上用红线标记)之间的空间如何增加它。 请帮忙。 最佳答案 对于上面
有没有办法从 MP android 图表(饼图)中抑制零值文本 最佳答案 如果值==0.0f,则使用自定义格式化程序并返回空字符串 public class CustomPercentFormatte
我正在使用 MpChart 的 LineChart 来显示我的图表。我添加了多个数据集行。一切正常。但我希望 MarkerView 应该设置在中间的某个点,并且默认情况下应该是可见的。现在标记 Vie
我已经实现了 MPChart 库的 BarChart。 当条形图中的条形数量低于 9 时,标签与条形对齐,但一旦计数增加到 9 以上,标签就会被跳过,而不是 x 轴上的 9 个标签,它只显示 4- 5
您好我想在条形图的 xaxis 中绘制图标而不是值。就像下面的图表 最佳答案 您必须创建自己的自定义渲染器并将其应用于您的图表。这是一个粗略的实现。 XML Activity publ
现在我正面临这个问题。我在 xAxis 中得到重复值,第一个和最后一个。图形值不根据各自 x 轴值的值。第二个问题是,如果我不想以 float 形式而是以 int Rounded 形式显示值,并将它们
我想从条形图项目中删除缩放。 当用户滚动条形图项目时,y 图例值会覆盖 x 图例值或 y 图例值显示在 X 轴下方。 这里是条形图项目的代码: import ro.charttest.R; i
本文整理了Java中com.zx.zxutils.views.MPChart.ZXPieChart类的一些代码示例,展示了ZXPieChart类的具体用法。这些代码示例主要来源于Github/Stac
本文整理了Java中com.zx.zxutils.views.MPChart.ZXLineChart类的一些代码示例,展示了ZXLineChart类的具体用法。这些代码示例主要来源于Github/St
例如,我有如下数据集: val dataSetX = {101, 205, 210, 445, 505} val dataSetY = {50, 100, 150, 200, 250} 图表 x 轴上
我有诸如整数或日期之类的值,但不知道在Android中何处使用它们。 这样,当我放大时,值保持在同一位置,并且值之间有一个空白空间。 我想在图表上显示它们之间的值,例如 [1 2 3],仅显示值 1,
这里尝试在 x 轴上设置日期。我正在将 Unix 时间戳 传递到 LineChart 的入口点,但无法获得输出输出正确的结果。 事实证明,由于条目使用 float ,我失去了时间戳的精度......足
我想隐藏(或者更好,不绘制)画线上的绘图点。 截图如下: 您对如何操作有什么建议吗?我阅读了文档,但发现没有任何用处。 提前致谢!再见! 最佳答案 看你用的是v2.0.7,还是用下面的方法。 line
您好,我在我的项目中使用 android MPAndroidChart 库。我想刷新图表而不刷新 Activity 页面。 提前致谢。 最佳答案 无论何时单击按钮或选择微调器,您都需要更新图表,只需调
我绘制了具有相应 X 轴和 Y 轴的图形。 现在如何获取 Y 轴标签并比较并在 Y 轴上放置另一个标签。 例如: 我得到的Y轴标签是1,2,3,4,5等等。现在如何分配相应的标签, 如果是 2,则低。
我是一名优秀的程序员,十分优秀!