- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想根据条形代表的 bin 中是否包含特定值来突出显示该条形。例如,如果下面的红色条表示 100-110(含)之间的值的数量,而我感兴趣的特定值是 103。我想突出显示该条(将其更改为与所有其他条不同的颜色)即红色而不是蓝色
我想到了子类化
org.jfree.data.statistics.HistogramDataset
与 XYBarRenderer 的子类一起使用以利用
org.jfree.chart.renderer.xy.XYItemRendererState#startSeriesPass
方法。我的想法是,我可以创建两个具有不同基色的相同系列。并配置 startSeriesPass 方法以绘制第一个系列中的所有条形图(bins),除了需要突出显示的条形图。然后在下一次迭代中仅绘制需要从第二个系列突出显示的条形图。
事实证明这非常困难,因为 org.jfree.data.statistics.HistogramDataset 将其 getBins 方法定义为 protected 包,我认为这是设计使然。
基于此,我想知道是否有一种规范的方法来更改 histogramDataset 中特定条形的颜色
最佳答案
除了突出显示直方图数据集中的条形之外,下面的 Controller 还做了几件事
package com.capitalone.mobile.orx.jchartpoc.controller;
import java.awt.Color;
import java.awt.Font;
import java.awt.Paint;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.annotations.XYPointerAnnotation;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.data.statistics.HistogramBin;
import org.jfree.data.statistics.HistogramDataset;
import org.jfree.ui.RectangleInsets;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Norbert Powell
* Created on Dec 21, 2016
*/
@RestController
public class HistogramController {
public class HistogramPlotGenerator {
private double upperBound;
private double minimum;
private double maximum;
private int bins = 10;
public class RelativeSpendRenderer extends XYBarRenderer{
private static final long serialVersionUID = 1L;
@Getter @Setter
private int userSpendLevelBarColumn;
@Getter @Setter
private Color userSpendLevelBarColumnColor = new Color(208,48,39);
public RelativeSpendRenderer(int usplCol) {
this.userSpendLevelBarColumn = usplCol;
}
@Override
public Paint getItemPaint(int row, int column) {
if (column == userSpendLevelBarColumn){
return userSpendLevelBarColumnColor;
}
return super.getItemPaint(row, column);
}
}
public JFreeChart createHisto(){
long chartCreationTime = System.currentTimeMillis();
HistogramDataset histogramDataSet = new HistogramDataset();
List<Number> spendLevels =
Arrays.asList(12,21,34,3,24,56,7,8,9,100,75,555,65,32,566,700,800,900,307,1000,10201,222,323,444,201,111);
double userSpendLevelValue = spendLevels.get(10).doubleValue(); // point to be highlighted
double [] spls = new double [spendLevels.size()];
minimum = Double.MAX_VALUE;
maximum = 0.0;
for(int i=0; i < spendLevels.size(); i++){
double spl = spendLevels.get(i).doubleValue();
maximum = Math.max(maximum,spl);
minimum = Math.min(minimum, spl);
spls[i] = spl;
}
upperBound = 0.0;
histogramDataSet.addSeries("Spend", spls, bins,minimum,maximum);
for ( int i=0; i <bins; i++){
upperBound = Math.max(histogramDataSet.getYValue(0, i), upperBound);
}
JFreeChart barGraph = ChartFactory.createHistogram(null, "$$$", null, histogramDataSet, PlotOrientation.VERTICAL, false, false, false);
System.out.println("Time to create bar chart: " + (System.currentTimeMillis() - chartCreationTime)+"ms");
int userSpendBarIndex = getHighlightBar(userSpendLevelValue);
XYPlot plot = barGraph.getXYPlot();
plot.setRenderer(new RelativeSpendRenderer(userSpendBarIndex));
placePointer(histogramDataSet, userSpendBarIndex, plot);
modifyChart(barGraph);
return barGraph;
}
private void placePointer(HistogramDataset histogramDataSet,int userSpendBarIndex, XYPlot plot) {
double x =histogramDataSet.getX(0, userSpendBarIndex).doubleValue();
double y = histogramDataSet.getY(0, userSpendBarIndex).doubleValue();
double angle = (3*Math.PI/2);
XYPointerAnnotation arrow = new XYPointerAnnotation(" ", x, y, angle);
arrow.setTipRadius(0); // distance of arrow head from bar
arrow.setBaseRadius(10);// distance from arrow head to end of arrow if arrowLength and BaseRadius are > 0 and arrowLength > BaseRadius only the arrow head will be shown
if (y == upperBound){
plot.getRangeAxis().setUpperBound(upperBound + arrow.getBaseRadius());
}else{
plot.getRangeAxis().setUpperBound(upperBound);
}
plot.addAnnotation(arrow);
}
private int getHighlightBar(double userSpendValue){
int highlightBarIndex=0;
double binWidth = (maximum - minimum) / bins;
double lower = minimum;
double upper;
ArrayList<HistogramBin> binList = new ArrayList<HistogramBin>(bins);
for (int i = 0; i < bins; i++) {
HistogramBin bin;
// make sure bins[bins.length]'s upper boundary ends at maximum
// to avoid the rounding issue. the bins[0] lower boundary is
// guaranteed start from min
if (i == bins - 1) {
bin = new HistogramBin(lower, maximum);
}
else {
upper = minimum + (i + 1) * binWidth;
bin = new HistogramBin(lower, upper);
lower = upper;
}
binList.add(bin);
}
for(HistogramBin bin : binList){
if (userSpendValue >= bin.getStartBoundary() && userSpendValue <= bin.getEndBoundary()){
return highlightBarIndex;
}
highlightBarIndex++;
}
return -1;
}
private void modifyChart(JFreeChart chart) {
Color lineChartColor = new Color(1, 158, 213);
// plot manipulations
XYPlot xyPlotModifier = chart.getXYPlot();
xyPlotModifier.setOutlineVisible(false);
xyPlotModifier.setRangeMinorGridlinesVisible(false);
xyPlotModifier.setRangeCrosshairVisible(false);
xyPlotModifier.setRangeGridlinesVisible(false);
xyPlotModifier.setRangeZeroBaselineVisible(false);
xyPlotModifier.setBackgroundPaint(Color.WHITE);
xyPlotModifier.getDataset().getSeriesCount();
//Axis modifications
xyPlotModifier.getRangeAxis().setVisible(false);
xyPlotModifier.getDomainAxis().setTickLabelsVisible(false);
xyPlotModifier.getDomainAxis().setMinorTickMarksVisible(false);
xyPlotModifier.getDomainAxis().setTickMarksVisible(false);
xyPlotModifier.getDomainAxis().setLabelFont(new Font("SansSerif", Font.PLAIN, 1));
xyPlotModifier.setAxisOffset(new RectangleInsets(0.0,0.0,0.0,0.0));
// Actual data point manipulations
XYBarRenderer renderer = (XYBarRenderer) xyPlotModifier.getRenderer();
renderer.setSeriesPaint(0,lineChartColor, true);
renderer.setBaseOutlinePaint(Color.BLACK, true);
renderer.setDrawBarOutline(true);
chart.removeLegend();
}
}
@RequestMapping(value = "getHisto", method = RequestMethod.GET, produces = MediaType.IMAGE_PNG_VALUE)
public ResponseEntity<byte[]> getPNGChart(@RequestHeader HttpHeaders headers)throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
HistogramPlotGenerator generator = new HistogramPlotGenerator();
ChartUtilities.writeBufferedImageAsPNG(baos, generator.createHisto().createBufferedImage(352, 90));
return new ResponseEntity<byte[]>(baos.toByteArray(), HttpStatus.OK);
}
}
getHighLightBar
和
RelativeSpendRenderer class
协同工作,生成需要高亮显示的条形索引,并在打印时搜索索引以高亮显示。
placePointer 方法将指针放在最高柱上并努力确保指针不会被截断
关于java - 如何显示具有不同颜色的单个直方图条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41105149/
我使用 为 .dat 文件中的一些数据创建了直方图 binwidth=... bin(x,width)=width*floor(x/width) plot 'file' using (bin($1,b
我需要能够在单个直方图上显示多条线,其中每条线都应该由一个参数表示。我有多个服务器,我想监控它们的 CPU 使用率。我的 Kibana 输入数据如下所示: 时间戳 |机器 |姓名 |值(value)
我在 Elasticsearch 中有一个索引,它包含一个简单对象数组(键值,请参见下面的示例)。 文档有时间戳。 我可以在 Kibana 中为每个键值创建单独的直方图(即一个用于 bytes_sen
所以我想出了如何将我的数据下钻到频率表 - Overall.Cond Freq 235 1 0 236 2 0 237
我的目标是使用 gnuplot 5.4 框创建直方图,并用特定的 RGB 值对每个框进行着色(出于测试目的,它是“绿色”,但在最终数据集中将是 #RRGGBB) 我的数据如下所示: 5.800507
我有 chr totgenes FST>0.4 %FST>0.4 exFST>0.4 %exFST>0.4 inFST>0.4 %inFST>0.4 chrtotlen 1 14
我用 matplotlib 创建了一个直方图使用 pyplot.hist()功能。我想在条形图中添加 bin 高度 ( sqrt(binheight) ) 的毒物误差平方根。我怎样才能做到这一点? .
我有兴趣在 R 中创建一个包含两个(或更多)人口的直方图,这意味着 - 我不希望两个直方图共享同一个图形,而是一个包含两种或更多颜色的条形图。 找到下面的图片 - 这就是我想要完成的。 有什么想法吗?
所以,我需要按日期制作数据直方图,但我有 xticlabel 重叠的问题,所以,我试图找到一个解决方案,如何跳过 xtics 以避免重叠。考虑到日期不是整数抽动,我试图以这种方式解决它: .dat 文
给定每小时都有数据点的(电力)市场数据的时间序列,我想显示一个包含每小时数据的所有时间/时间范围平均值的条形图,以便分析师可以轻松地将实际价格与所有时间平均值进行比较(一天中哪个小时最贵/最便宜)。
+----+----+--------+ | Id | M1 | trx | +----+----+--------+ | 1 | M1 | 11.35 | | 2 | M1 | 3.4
所以,我需要按日期制作数据直方图,但我有 xticlabel 重叠的问题,所以,我试图找到一个解决方案,如何跳过 xtics 以避免重叠。考虑到日期不是整数抽动,我试图以这种方式解决它: .dat 文
我有以下示例数据文件,我想在 gnuplot 中将其绘制为直方图 1 1 2 2 4 3 我正在使用以下命令绘制数据:用方框绘制“sample.data”,生成以下图表: ##
我是 Java 编码新手,我正在尝试使用提供给我的以下方法创建直方图。这些注释是对每个方法的说明,稍后我们将使用它们来创建主方法并打印直方图。我已经达到了方法 3,并且能够很好地编译所有内容,但我不确
我有一个由服务器上的程序生成的连续生成的数据(文本文件)。我想将数据绘制为实时图表,就像 powergrid做。这是我的方法: 由于数据是在服务器上以文本文件的形式连续生成的,因此我编写了一个 PHP
我正在尝试通过一个函数使用 D3 创建一个简单的直方图。图表的 y 值作为数组传递给函数,然后函数创建 svg 和条形图。我得到了正确的轴,但条被切断了。 似乎我的矩形 x 值太大而无法放入 svg
有没有办法用 linq 做一个分段直方图?我见过几个示例,您可以在其中计算特定对象的出现次数。是否可以创建一个基于 linq 的直方图来计算两个值之间的一系列对象的出现次数? 我不知道您将如何按一系列
我正在参加初级 Java 类(class),任务是创建一个具有以下输出的直方图程序:(100 和 10 是用户输入)。 有多少个数字? 100 间隔多少? 10 Histogram ---------
如何使用 corePlot 实现直方图。实际上,我正在尝试使用条形图。 在条形图中是否有任何选项可以对我的值进行分组。例如:所以我只能打印 3 条。这样值应该像这样分组: X 0...5: B
我有一个简单的数据集,其中脚本需要时间来完成各个步骤。时间是不可预测的,但主要分组在特定的时间范围内,但我想以十分之一秒的分组来绘制图表。 (我知道这很奇怪,这是一些报告可视化内容的要求)。我可以将我
我是一名优秀的程序员,十分优秀!