如何在java中绘制颜色图?

我有一个数据集,其中包含3列,x,y和(x,y)处的值。 我想绘制类似于波纹管地图的地图。 如何在jfreechart或任何可用于这种情节的库中绘制这种类型的图形?

在此处输入图像描述

XYBlockRenderer看起来很不错。 您可以使用Color.getHSBColor() ,就像它们在这里显示的那样,来制作PaintScale

图片

从这个示例开始并使用这个想法 ,您可以使用SpectrumPaintScale获取颜色调色板,如下所示。

图片

 import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Paint; import javax.swing.JFrame; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.AxisLocation; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.PaintScale; import org.jfree.chart.renderer.xy.XYBlockRenderer; import org.jfree.chart.title.PaintScaleLegend; import org.jfree.data.xy.DefaultXYZDataset; import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYZDataset; import org.jfree.ui.RectangleEdge; import org.jfree.ui.RectangleInsets; /** @see https://stackoverflow.com/a/37235165/230513 */ public class XYZChartDemo { private static final int N = 1000; public XYZChartDemo(String title) { JFrame f = new JFrame(title); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ChartPanel chartPanel = new ChartPanel(createChart(createDataset())) { @Override public Dimension getPreferredSize() { return new Dimension(640, 480); } }; chartPanel.setMouseZoomable(true, false); f.add(chartPanel); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } private static JFreeChart createChart(XYDataset dataset) { NumberAxis xAxis = new NumberAxis("x Axis"); NumberAxis yAxis = new NumberAxis("y Axis"); XYPlot plot = new XYPlot(dataset, xAxis, yAxis, null); XYBlockRenderer r = new XYBlockRenderer(); SpectrumPaintScale ps = new SpectrumPaintScale(0, N * N); r.setPaintScale(ps); r.setBlockHeight(10.0f); r.setBlockWidth(10.0f); plot.setRenderer(r); JFreeChart chart = new JFreeChart("Title", JFreeChart.DEFAULT_TITLE_FONT, plot, false); NumberAxis scaleAxis = new NumberAxis("Scale"); scaleAxis.setAxisLinePaint(Color.white); scaleAxis.setTickMarkPaint(Color.white); PaintScaleLegend legend = new PaintScaleLegend(ps, scaleAxis); legend.setSubdivisionCount(128); legend.setAxisLocation(AxisLocation.TOP_OR_RIGHT); legend.setPadding(new RectangleInsets(10, 10, 10, 10)); legend.setStripWidth(20); legend.setPosition(RectangleEdge.RIGHT); legend.setBackgroundPaint(Color.WHITE); chart.addSubtitle(legend); chart.setBackgroundPaint(Color.white); return chart; } private static XYZDataset createDataset() { DefaultXYZDataset dataset = new DefaultXYZDataset(); for (int i = 0; i < N; i = i + 10) { double[][] data = new double[3][N]; for (int j = 0; j < N; j = j + 10) { data[0][j] = i; data[1][j] = j; data[2][j] = i * j; } dataset.addSeries("Series" + i, data); } return dataset; } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new XYZChartDemo("XYZ Demo"); } }); } private static class SpectrumPaintScale implements PaintScale { private static final float H1 = 0f; private static final float H2 = 1f; private final double lowerBound; private final double upperBound; public SpectrumPaintScale(double lowerBound, double upperBound) { this.lowerBound = lowerBound; this.upperBound = upperBound; } @Override public double getLowerBound() { return lowerBound; } @Override public double getUpperBound() { return upperBound; } @Override public Paint getPaint(double value) { float scaledValue = (float) (value / (getUpperBound() - getLowerBound())); float scaledH = H1 + scaledValue * (H2 - H1); return Color.getHSBColor(scaledH, 1f, 1f); } } } 

您可以使用BubbleChart来说明包含3列的数据集。

有一些android库包含一些看起来很好的图表。

Android版HelloCharts: https : //github.com/lecho/hellocharts-android

MPAndroidChart: https : //github.com/PhilJay/MPAndroidChart

希望这能解决你的问题。