Java 如何使用jFreeChart确定StackedBarChart中ItemMargin属性的最小值和最大值
我正在使用jFreeChart api制作一个应用程序,以便在滑动条移动时,两个条之间的间隙宽度根据滑动条的值增加或减少。但我发现不同的图表和不同的数据项的保证金属性会有所不同。 为了说明问题,我附加了以下代码:-Java 如何使用jFreeChart确定StackedBarChart中ItemMargin属性的最小值和最大值,java,swing,jfreechart,Java,Swing,Jfreechart,我正在使用jFreeChart api制作一个应用程序,以便在滑动条移动时,两个条之间的间隙宽度根据滑动条的值增加或减少。但我发现不同的图表和不同的数据项的保证金属性会有所不同。 为了说明问题,我附加了以下代码:- 导入java.awt.BorderLayout; 导入java.awt.Container; 导入java.awt.Dimension; 导入javax.swing.BorderFactory; 导入javax.swing.JFrame; 导入javax.swing.JPanel;
导入java.awt.BorderLayout;
导入java.awt.Container;
导入java.awt.Dimension;
导入javax.swing.BorderFactory;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JSlider;
导入javax.swing.event.ChangeEvent;
导入javax.swing.event.ChangeListener;
导入org.jfree.chart.ChartFactory;
导入org.jfree.chart.ChartPanel;
导入org.jfree.chart.JFreeChart;
导入org.jfree.chart.LegendItemCollection;
导入org.jfree.chart.axis.DateAxis;
导入org.jfree.chart.axis.subcategory axis;
导入org.jfree.chart.plot.CategoryPlot;
导入org.jfree.chart.plot.PlotOrientation;
导入org.jfree.chart.renderer.category.GroupedStackedBlunderer;
导入org.jfree.data.KeyToGroupMap;
导入org.jfree.data.category.CategoryDataset;
导入org.jfree.data.category.DefaultCategoryDataset;
导入org.jfree.ui.ApplicationFrame;
导入org.jfree.ui.RefineryUtilities;
公共类DomainTranslateDemo扩展了ApplicationFrame{
私有静态类DemoPanel扩展JPanel实现ChangeListener{
私有静态int滑块\u初始值=50;
专用滑动滑块;
私有数据轴域;
private int lastValue=滑块\初始\值;
私有GroupedStackedBlunderer渲染器;
//一个月(毫秒、秒、分钟、小时、天)
私有整数增量=1000*60*60*24*30;
公共小组(){
超级(新边框布局());
final CategoryDataset dataset=createDataset();
最终JFreeChart图表=createChart(数据集);
最终图表面板图表面板=新图表面板(图表);
尺寸标注=新尺寸(590350);
chartPanel.setPreferredSize(尺寸);
添加(图表面板);
JPanel dashboard=newjpanel(newborderlayout());
setboard.order(BorderFactory.createEmptyByOrder(0,4,4,4));
this.slider=新的JSlider(0,100,slider\u初始值);
this.slider.addChangeListener(this);
dashboard.add(此.slider);
添加(仪表板,BorderLayout.SOUTH);
}
私有类别数据集createDataset(){
DefaultCategoryDataset结果=新建DefaultCategoryDataset();
结果:增加值(1.5,“5YEUR”,“5Y”);
结果:增加值(-1.5,“5YUSD”,“5Y”);
结果:增加值(0.5,“5Yx5YEUR”,“5Yx5Y”);
结果:增加值(-0.5,“5Yx5YUSD”,“5Yx5Y”);
结果:增加值(1.5,“10Yx5YEUR”,“10Yx5Y”);
结果:增加值(-1.5,“10Yx5YUSD”,“10Yx5Y”);
结果:增加值(1.5,“15Yx5YEUR”,“15Yx5Y”);
结果:增加值(-1.5,“15Yx5YUSD”,“15Yx5Y”);
结果:增加值(1.5,“20Yx5YEUR”,“20Yx5Y”);
结果:增加值(-1.5,“20Yx5YUSD”,“20Yx5Y”);
结果:增加值(1.5,“20Yx5YEUR”,“25Yx5Y”);
结果:增加值(-1.5,“20Yx5YUSD”,“25Yx5Y”);
//结果:增加值(11.9,“产品3(美国)”,“2004年1月”);
返回结果;
}
私有JFreeChart createChart(最终类别数据集数据集){
最终JFreeChart图表=ChartFactory.createStackedBarChart(
“最大条形宽度”,//图表标题
“类别”,//域轴标签
“值”,//范围轴标签
数据集,//数据
PlotOrientation.VERTICAL,//打印方向
对,//图例
true,//工具提示
false//url
);
renderer=新的groupedStackedBallenderer();
KeyToGroupMap=新的KeyToGroupMap(“G1”);
mapKeyToGroup(“5YEUR”、“G1”);
mapKeyToGroup(“5YUSD”、“G1”);
mapKeyToGroup(“5Yx5YEUR”,“G2”);
mapKeyToGroup(“5Yx5YUSD”、“G2”);
mapKeyToGroup(“10Yx5YEUR”,“G3”);
mapKeyToGroup(“10Yx5YUSD”、“G3”);
mapKeyToGroup(“15Yx5YEUR”,“G4”);
mapKeyToGroup(“15Yx5YUSD”、“G4”);
mapKeyToGroup(“20Yx5YEUR”,“G5”);
mapKeyToGroup(“20Yx5YUSD”、“G5”);
mapKeyToGroup(“25Yx5YEUR”,“G6”);
mapKeyToGroup(“25Yx5YUSD”、“G6”);
渲染器.setSeriesToGroupMap(map);
double maxBarWidth=renderer.getMaximumBarWidth();
//.setMaximumBarWidth(1);
.setItemMargin(-20);
/*子类别轴域轴=新的子类别轴(“产品/月份”);
域轴毛类边缘蛋白(0.05);
domainAxis.addSubCategory(“产品1”);
domainAxis.addSubCategory(“产品2”);
domainAxis.addSubCategory(“产品3”)*/
CategoryPlot=(CategoryPlot)chart.getPlot();
//plot.setDomainAxis(domainAxis);
plot.setRenderer(渲染器);
plot.setFixedLegendItems(createLegendItems());
收益表;
}
/**
*@返回图例项目。
*/
私有LegendItemCollection createLegendItems(){
LegendItemCollection结果=新建LegendItemCollection();
返回结果;
}
@凌驾
公共无效状态已更改(ChangeEvent事件){
int value=this.slider.getValue();
/*最小长=domainAxis.getMinimumDate().getTime();
最大长=domainAxis.getMaximumDate().getTime();
如果(值我认为您只需要使用更多的负范围,例如。
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.LegendItemCollection;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.SubCategoryAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.GroupedStackedBarRenderer;
import org.jfree.data.KeyToGroupMap;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
public class DomainTranslateDemo extends ApplicationFrame {
private static class DemoPanel extends JPanel implements ChangeListener {
private static int SLIDER_INITIAL_VALUE = 50;
private JSlider slider;
private DateAxis domainAxis;
private int lastValue = SLIDER_INITIAL_VALUE;
private GroupedStackedBarRenderer renderer;
// one month (milliseconds, seconds, minutes, hours, days)
private int delta = 1000 * 60 * 60 * 24 * 30;
public DemoPanel() {
super(new BorderLayout());
final CategoryDataset dataset = createDataset();
final JFreeChart chart = createChart(dataset);
final ChartPanel chartPanel = new ChartPanel(chart);
Dimension Dim = new Dimension(590, 350);
chartPanel.setPreferredSize(Dim);
add(chartPanel);
JPanel dashboard = new JPanel(new BorderLayout());
dashboard.setBorder(BorderFactory.createEmptyBorder(0, 4, 4, 4));
this.slider = new JSlider(0, 100, SLIDER_INITIAL_VALUE);
this.slider.addChangeListener(this);
dashboard.add(this.slider);
add(dashboard, BorderLayout.SOUTH);
}
private CategoryDataset createDataset() {
DefaultCategoryDataset result = new DefaultCategoryDataset();
result.addValue(1.5, "5YEUR", "5Y");
result.addValue(-1.5, "5YUSD", "5Y");
result.addValue(0.5, "5Yx5YEUR", "5Yx5Y");
result.addValue(-0.5, "5Yx5YUSD", "5Yx5Y");
result.addValue(1.5, "10Yx5YEUR", "10Yx5Y");
result.addValue(-1.5, "10Yx5YUSD", "10Yx5Y");
result.addValue(1.5, "15Yx5YEUR", "15Yx5Y");
result.addValue(-1.5, "15Yx5YUSD", "15Yx5Y");
result.addValue(1.5, "20Yx5YEUR", "20Yx5Y");
result.addValue(-1.5, "20Yx5YUSD", "20Yx5Y");
result.addValue(1.5, "20Yx5YEUR", "25Yx5Y");
result.addValue(-1.5, "20Yx5YUSD", "25Yx5Y");
//result.addValue(11.9, "Product 3 (US)", "Jan 04");
return result;
}
private JFreeChart createChart(final CategoryDataset dataset) {
final JFreeChart chart = ChartFactory.createStackedBarChart(
"Max Bar Width", // chart title
"Category", // domain axis label
"Value", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // the plot orientation
true, // legend
true, // tooltips
false // urls
);
renderer = new GroupedStackedBarRenderer();
KeyToGroupMap map = new KeyToGroupMap("G1");
map.mapKeyToGroup("5YEUR", "G1");
map.mapKeyToGroup("5YUSD", "G1");
map.mapKeyToGroup("5Yx5YEUR", "G2");
map.mapKeyToGroup("5Yx5YUSD", "G2");
map.mapKeyToGroup("10Yx5YEUR", "G3");
map.mapKeyToGroup("10Yx5YUSD", "G3");
map.mapKeyToGroup("15Yx5YEUR", "G4");
map.mapKeyToGroup("15Yx5YUSD", "G4");
map.mapKeyToGroup("20Yx5YEUR", "G5");
map.mapKeyToGroup("20Yx5YUSD", "G5");
map.mapKeyToGroup("25Yx5YEUR", "G6");
map.mapKeyToGroup("25Yx5YUSD", "G6");
renderer.setSeriesToGroupMap(map);
double maxBarWidth = renderer.getMaximumBarWidth();
//renderer.setMaximumBarWidth(1);
renderer.setItemMargin(-20);
/* SubCategoryAxis domainAxis = new SubCategoryAxis("Product / Month");
domainAxis.setCategoryMargin(0.05);
domainAxis.addSubCategory("Product 1");
domainAxis.addSubCategory("Product 2");
domainAxis.addSubCategory("Product 3");*/
CategoryPlot plot = (CategoryPlot) chart.getPlot();
//plot.setDomainAxis(domainAxis);
plot.setRenderer(renderer);
plot.setFixedLegendItems(createLegendItems());
return chart;
}
/**
* @return The legend items.
*/
private LegendItemCollection createLegendItems() {
LegendItemCollection result = new LegendItemCollection();
return result;
}
@Override
public void stateChanged(ChangeEvent event) {
int value = this.slider.getValue();
/* long minimum = domainAxis.getMinimumDate().getTime();
long maximum = domainAxis.getMaximumDate().getTime();
if (value<lastValue) { // left
minimum = minimum - delta;
maximum = maximum - delta;
} else { // right
minimum = minimum + delta;
maximum = maximum + delta;
}
DateRange range = new DateRange(minimum,maximum);
domainAxis.setRange(range);*/
System.out.println("value:"+value);
renderer.setItemMargin(value/100.0);
}
}
public DomainTranslateDemo(String title) {
super(title);
setContentPane(new DemoPanel());
}
public static JPanel createDemoPanel() {
return new DemoPanel();
}
public static void main(String[] args) {
DomainTranslateDemo demo = new DomainTranslateDemo("Translate Demo");
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
}
}
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.LegendItemCollection;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.GroupedStackedBarRenderer;
import org.jfree.data.KeyToGroupMap;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
/** @see http://stackoverflow.com/a/17342522/230513 */
public class DomainTranslateDemo extends ApplicationFrame {
private static class DemoPanel extends JPanel implements ChangeListener {
private static int SLIDER_INITIAL_VALUE = -42;
private static final double INCREMENT = 1 / 10.0;
private JSlider slider;
private GroupedStackedBarRenderer renderer;
public DemoPanel() {
super(new BorderLayout());
final CategoryDataset dataset = createDataset();
final JFreeChart chart = createChart(dataset);
final ChartPanel chartPanel = new ChartPanel(chart);
Dimension Dim = new Dimension(590, 350);
chartPanel.setPreferredSize(Dim);
add(chartPanel);
JPanel dashboard = new JPanel(new BorderLayout());
dashboard.setBorder(BorderFactory.createEmptyBorder(0, 4, 4, 4));
this.slider = new JSlider(-50, 10, SLIDER_INITIAL_VALUE);
this.slider.addChangeListener(this);
dashboard.add(this.slider);
add(dashboard, BorderLayout.SOUTH);
}
private CategoryDataset createDataset() {
DefaultCategoryDataset result = new DefaultCategoryDataset();
result.addValue(1.5, "5YEUR", "5Y");
result.addValue(-1.5, "5YUSD", "5Y");
result.addValue(0.5, "5Yx5YEUR", "5Yx5Y");
result.addValue(-0.5, "5Yx5YUSD", "5Yx5Y");
result.addValue(1.5, "10Yx5YEUR", "10Yx5Y");
result.addValue(-1.5, "10Yx5YUSD", "10Yx5Y");
result.addValue(1.5, "15Yx5YEUR", "15Yx5Y");
result.addValue(-1.5, "15Yx5YUSD", "15Yx5Y");
result.addValue(1.5, "20Yx5YEUR", "20Yx5Y");
result.addValue(-1.5, "20Yx5YUSD", "20Yx5Y");
result.addValue(1.5, "20Yx5YEUR", "25Yx5Y");
result.addValue(-1.5, "20Yx5YUSD", "25Yx5Y");
return result;
}
private JFreeChart createChart(final CategoryDataset dataset) {
final JFreeChart chart = ChartFactory.createStackedBarChart(
"Max Bar Width", // chart title
"Category", // domain axis label
"Value", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // the plot orientation
true, // legend
true, // tooltips
false // urls
);
renderer = new GroupedStackedBarRenderer();
KeyToGroupMap map = new KeyToGroupMap("G1");
map.mapKeyToGroup("5YEUR", "G1");
map.mapKeyToGroup("5YUSD", "G1");
map.mapKeyToGroup("5Yx5YEUR", "G2");
map.mapKeyToGroup("5Yx5YUSD", "G2");
map.mapKeyToGroup("10Yx5YEUR", "G3");
map.mapKeyToGroup("10Yx5YUSD", "G3");
map.mapKeyToGroup("15Yx5YEUR", "G4");
map.mapKeyToGroup("15Yx5YUSD", "G4");
map.mapKeyToGroup("20Yx5YEUR", "G5");
map.mapKeyToGroup("20Yx5YUSD", "G5");
map.mapKeyToGroup("25Yx5YEUR", "G6");
map.mapKeyToGroup("25Yx5YUSD", "G6");
renderer.setSeriesToGroupMap(map);
double maxBarWidth = renderer.getMaximumBarWidth();
renderer.setItemMargin(SLIDER_INITIAL_VALUE * INCREMENT);
CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setRenderer(renderer);
plot.setFixedLegendItems(createLegendItems());
return chart;
}
private LegendItemCollection createLegendItems() {
LegendItemCollection result = new LegendItemCollection();
return result;
}
@Override
public void stateChanged(ChangeEvent event) {
int value = slider.getValue();
System.out.println("value:" + value);
renderer.setItemMargin(value * INCREMENT);
}
}
public DomainTranslateDemo(String title) {
super(title);
setContentPane(new DemoPanel());
}
public static JPanel createDemoPanel() {
return new DemoPanel();
}
public static void main(String[] args) {
DomainTranslateDemo demo = new DomainTranslateDemo("Translate Demo");
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
}
}