紧急求助:ChartDirector 曲线图 X-Y轴倒置问题

xiaohanxue 2009-10-14 09:31:42
求助各位大虾,ChartDirector 曲线图 X-Y轴反转问题。
详细:偶用ChartDirector在坐标轴里画多条曲线,现在的效果是以X轴的数据为基础,Y轴为每个X对应的数值。但是,要求的效果是将基础数据作为Y轴,X轴数据为对应的数值,各位看该如何解决呢?以下为现在的代码:
// The data for the line chart
double[] data0 = {42, 49, 33, 38, 51, 46, 29, 41, 44, 57, 59, 52, 37, 34, 51, 56, 56,
60, 70, 76, 63, 67, 75, 64, 51};
double[] data1 = {50, 55, 47, 34, 42, 49, 63, 62, 73, 59, 56, 50, 64, 60, 67, 67, 58,
59, 73, 77, 84, 82, 80, 84, 98};
double[] data2 = {36, 28, 25, 33, 38, 20, 22, 30, 25, 33, 30, 24, 28, 15, 21, 26, 46,
42, 48, 45, 43, 52, 64, 60, 70};

// The labels for the line chart
String[] labels = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11",
"12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"};

XYChart c = new XYChart(600, 300, 0xeeeeff, 0x000000, 1);
c.setRoundedFrame();
c.setPlotArea(55, 58, 520, 195, 0xffffff, -1, -1, 0xcccccc, 0xcccccc);
c.addLegend(50, 30, false, "Arial Bold", 9).setBackground(Chart.Transparent);
c.addTitle("Application Server Throughput", "Times New Roman Bold Italic", 15
).setBackground(0xccccff, 0x000000, Chart.glassEffect());

c.yAxis().setTitle("MBytes per hour");
c.xAxis().setLabels(labels);
c.xAxis().setLabelStep(3);
c.xAxis().setTitle("Jun 12, 2006");

LineLayer layer = c.addLineLayer2();
layer.setLineWidth(2);
layer.addDataSet(data0, 0xff0000, "Server #1");
layer.addDataSet(data1, 0x008800, "Server #2");
layer.addDataSet(data2, c.dashLineColor(0x3333ff, Chart.DashLine), "Server #3");

String chart1URL = c.makeSession(request, "chart1");
String imageMap1 = c.getHTMLImageMap("", "",
"title='[{dataSetName}] Hour {xLabel}: {value} MBytes'");
...全文
909 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohanxue 2009-10-28
  • 打赏
  • 举报
回复
这可是救命贴,不要沉啊。
xiaohanxue 2009-10-27
  • 打赏
  • 举报
回复
不要沉啊。
再请教个问题:现在categoryLabel显示的太多了,所以都成黑乎乎一片看不清楚了。所以请问哪位大侠知道该怎么设置一下间隔呀,比方说我隔十个点才显示一个Label?
lzh_me 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xiaohanxue 的回复:]
上面所列的四个问题中的前三个我已解决,就麻烦高手帮忙指点一下第四个问题吧。
[/Quote]
HOHO~~第四个问题解决不了,没有涉及过。不过既然能够指定线条的颜色我想特殊数值使用特殊颜色也是能够实现的。不是很明确你需要什么效果,你可以下载一份JFreeChart的demo看一下上面是否有你想要的效果,那些demo里面是有些特殊数值使用特殊显示的。
xiaohanxue 2009-10-22
  • 打赏
  • 举报
回复
上面所列的四个问题中的前三个我已解决,就麻烦高手帮忙指点一下第四个问题吧。
xiaohanxue 2009-10-22
  • 打赏
  • 举报
回复
To lvbang_lzt:谢谢你的回答。
我先把程序跑起来看了一下运行结果,基本是所要求的样子。
另外还想问:
1.y轴的label是否可以放在左边。
2.我的坐标里面不用柱状图,但要多条曲线,应该可以吧。
3.x轴上下两个不同的label,代表什么意思?
4.我需要在一个特定的x值,比方说x=5时做一下标记,可以把5对应的底线换成别的颜色吗?因为某个x值是一个界限,超了这个界限,需要突出标记一下,让用户看的更明白。如果不能更换底线的颜色,或者把x>5以后的线变成虚线也行。

如果哪为高手很容易能回答这几个问题的话,就麻烦告诉我一下吧。我自己也先研究着。以前作图都用的ChartDirector,没有用过jfree。
lzh_me 2009-10-21
  • 打赏
  • 举报
回复
你运行一下,看看是不是想要这种效果?

/* ------------------
* DualAxisDemo3.java
* ------------------
* (C) Copyright 2002-2005, by Object Refinery Limited.
*
*/

package demo;

import java.awt.Color;

import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
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.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.RefineryUtilities;

/**
* A simple demonstration application showing how to create a dual axis chart
* based on data from two {@link CategoryDataset} instances.
*/
public class DualAxisDemo3 extends ApplicationFrame {

/**
* Creates a new demo instance.
*
* @param title the frame title.
*/
public DualAxisDemo3(String title) {

super(title);
JFreeChart chart = createChart();
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
setContentPane(chartPanel);

}

private static JFreeChart createChart() {
CategoryDataset dataset1 = createDataset1();

// create the chart...
JFreeChart chart = ChartFactory.createBarChart(
"Dual Axis Chart", // chart title
"Category", // domain axis label
"Value", // range axis label
dataset1, // dataset
PlotOrientation.HORIZONTAL, // orientation
true, // include legend
true,
false
);

// NOW DO SOME OPTIONAL CUSTOMISATION OF THE CHART...

// set the background color for the chart...
chart.setBackgroundPaint(new Color(0xCC, 0xFF, 0xCC));
LegendTitle legend = (LegendTitle) chart.getSubtitle(0);
legend.setPosition(RectangleEdge.LEFT);

// get a reference to the plot for further customisation...
CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
plot.getDomainAxis().setMaximumCategoryLabelWidthRatio(10.0f);
CategoryDataset dataset2 = createDataset2();
ValueAxis axis2 = new NumberAxis("Secondary");
plot.setRangeAxis(1, axis2);
plot.setDataset(1, dataset2);
plot.mapDatasetToRangeAxis(1, 1);
plot.setRangeAxisLocation(1, AxisLocation.BOTTOM_OR_RIGHT);
CategoryItemRenderer renderer2 = new LineAndShapeRenderer();
plot.setRenderer(1, renderer2);
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
// OPTIONAL CUSTOMISATION COMPLETED.
return chart;
}

/**
* Creates a sample dataset.
*
* @return The dataset.
*/
private static CategoryDataset createDataset1() {

// row keys...
String series1 = "First";
String series2 = "Second";
String series3 = "Third";

// column keys...
String category1 = "Category 1";
String category2 = "Category 2";
String category3 = "Category 3";
String category4 = "Category 4";
String category5 = "Category 5";
String category6 = "Category 6";
String category7 = "Category 7";
String category8 = "Category 8";

// create the dataset...
DefaultCategoryDataset dataset = new DefaultCategoryDataset();

dataset.addValue(1.0, series1, category1);
dataset.addValue(4.0, series1, category2);
dataset.addValue(3.0, series1, category3);
dataset.addValue(5.0, series1, category4);
dataset.addValue(5.0, series1, category5);
dataset.addValue(7.0, series1, category6);
dataset.addValue(7.0, series1, category7);
dataset.addValue(8.0, series1, category8);

dataset.addValue(5.0, series2, category1);
dataset.addValue(7.0, series2, category2);
dataset.addValue(6.0, series2, category3);
dataset.addValue(8.0, series2, category4);
dataset.addValue(4.0, series2, category5);
dataset.addValue(4.0, series2, category6);
dataset.addValue(2.0, series2, category7);
dataset.addValue(1.0, series2, category8);

dataset.addValue(4.0, series3, category1);
dataset.addValue(3.0, series3, category2);
dataset.addValue(2.0, series3, category3);
dataset.addValue(3.0, series3, category4);
dataset.addValue(6.0, series3, category5);
dataset.addValue(3.0, series3, category6);
dataset.addValue(4.0, series3, category7);
dataset.addValue(3.0, series3, category8);

return dataset;

}

/**
* Creates a sample dataset.
*
* @return The dataset.
*/
private static CategoryDataset createDataset2() {

// row keys...
String series1 = "Fourth";

// column keys...
String category1 = "Category 1";
String category2 = "Category 2";
String category3 = "Category 3";
String category4 = "Category 4";
String category5 = "Category 5";
String category6 = "Category 6";
String category7 = "Category 7";
String category8 = "Category 8";

// create the dataset...
DefaultCategoryDataset dataset = new DefaultCategoryDataset();

dataset.addValue(15.0, series1, category1);
dataset.addValue(24.0, series1, category2);
dataset.addValue(31.0, series1, category3);
dataset.addValue(25.0, series1, category4);
dataset.addValue(56.0, series1, category5);
dataset.addValue(37.0, series1, category6);
dataset.addValue(77.0, series1, category7);
dataset.addValue(18.0, series1, category8);

return dataset;

}

/**
* Creates a panel for the demo (used by SuperDemo.java).
*
* @return A panel.
*/
public static JPanel createDemoPanel() {
JFreeChart chart = createChart();
return new ChartPanel(chart);
}

/**
* Starting point for the demonstration application.
*
* @param args ignored.
*/
public static void main(String[] args) {

DualAxisDemo3 demo = new DualAxisDemo3("Dual Axis Demo 3");
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);

}

}

xiaohanxue 2009-10-21
  • 打赏
  • 举报
回复
咋没人看呢?大虾帮忙啊。

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧