Java 如何从折线图更改为条形图
我有这个折线图,想把它做成一个条形图,但我是Java新手,不知道是否可能,因为x轴是Java 如何从折线图更改为条形图,java,charts,jfreechart,Java,Charts,Jfreechart,我有这个折线图,想把它做成一个条形图,但我是Java新手,不知道是否可能,因为x轴是TimeSeries。这是我用来可视化折线图的代码: public class Time { private static Time INSTANCE; public static boolean isInitialized = false; private Marker marker; private Long markerStart; private Long markerEnd; private XY
TimeSeries
。这是我用来可视化折线图的代码:
public class Time {
private static Time INSTANCE;
public static boolean isInitialized = false;
private Marker marker;
private Long markerStart;
private Long markerEnd;
private XYPlot plot;
long last_lowerBound;
long last_upperBound;
@Inject
public Time() {
}
Composite comp;
TimeSeriesCollection dataset;
ChartPanel panel;
JFreeChart chart;
protected Point endPoint;
@PostConstruct
public void postConstruct(Composite parent) {
comp = new Composite(parent, SWT.NONE | SWT.EMBEDDED);
Frame frame = SWT_AWT.new_Frame(comp);
JApplet rootContainer = new JApplet();
TimeSeries series = new TimeSeries("Timeline");
dataset = new TimeSeriesCollection();
String plotTitle = "";
String xaxis = "Time";
String yaxis = "Docs";
PlotOrientation orientation = PlotOrientation.VERTICAL;
boolean show = false;
boolean toolTips = true;
boolean urls = false;
chart = ChartFactory.createTimeSeriesChart(plotTitle, xaxis, yaxis, dataset, show, toolTips, urls );
// get a reference to the plot for further customisation...
plot = chart.getXYPlot();
plot.setBackgroundPaint(Color.white);
plot.setDomainGridlinePaint(Color.gray);
plot.setRangeGridlinePaint(Color.gray);
plot.setOutlinePaint(Color.white);
plot.getRangeAxis().setLabel("");
plot.getDomainAxis().setLabel("");
ValueAxis y_axis = plot.getRangeAxis(); // Y
ValueAxis x_axis = plot.getDomainAxis(); // X
Font font = new Font("Veranda", Font.PLAIN, 12);
y_axis.setTickLabelFont(font);
x_axis.setTickLabelFont(font);
x_axis.setTickLabelPaint(Color.black);
y_axis.setTickLabelPaint(Color.black);
plot.getDomainAxis().setAxisLineVisible(false);
final XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
// renderer.setSeriesLinesVisible(0, false);
renderer.setSeriesShapesVisible(0, false);
plot.setRenderer(renderer);
我应该只更新这一行:chart=ChartFactory.createTimeSeriesChart(绘图标题、xaxis、yaxis、数据集、显示、工具提示、URL)代码>或者我应该完全更改它
我试着像这样更改此部分,但它没有显示任何内容:
dataset = new TimeSeriesCollection();
String plotTitle = "";
String xaxis = "Time";
String yaxis = "Docs";
PlotOrientation orientation = PlotOrientation.VERTICAL;
boolean show = false;
boolean toolTips = true;
boolean urls = false;
chart = ChartFactory.createBarChart(plotTitle, xaxis, yaxis, (CategoryDataset) dataset, orientation, show, toolTips, urls);
chart.setBackgroundPaint(null);
chart.setBackgroundImageAlpha(0.0f);
CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setRangeGridlinesVisible(false);
plot.setDomainGridlinesVisible(false);
plot.setOutlineVisible(false);
plot.setRangeZeroBaselineVisible(false);
plot.setDomainGridlinesVisible(false);
plot.setBackgroundPaint(COLOR_INVISIBLE);
plot.setBackgroundImageAlpha(0.0f);
BarRenderer renderer = (BarRenderer) plot.getRenderer();
renderer.setSeriesPaint(0, AttributeGuiTools.getColorForValueType(Ontology.NOMINAL));
renderer.setBarPainter(new StandardBarPainter());
renderer.setDrawBarOutline(true);
renderer.setShadowVisible(false); } }
任何帮助都将不胜感激 给定一个合适的,例如,您可以替换为,它提供了可选的DateAxis
。下面的示例使用相同的数据集创建两个图表
IntervalXYDataset dataset = createDataset();
f.add(createPanel(ChartFactory.createXYBarChart("Data", "Time", true, "Value", dataset)));
f.add(createPanel(ChartFactory.createTimeSeriesChart("Data", "Time", "Value", dataset)));
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.GridLayout;
导入java.text.simpleDataFormat;
导入java.util.Calendar;
导入javax.swing.JFrame;
导入org.jfree.chart.ChartFactory;
导入org.jfree.chart.ChartPanel;
导入org.jfree.chart.JFreeChart;
导入org.jfree.chart.axis.DateAxis;
导入org.jfree.chart.axis.DateTickMarkPosition;
导入org.jfree.chart.axis.DateTickUnit;
导入org.jfree.chart.axis.DateTickUnitType;
导入org.jfree.chart.plot.XYPlot;
导入org.jfree.data.time.TimeSeries;
导入org.jfree.data.time.TimeSeriesCollection;
导入org.jfree.data.time.Year;
导入org.jfree.data.xy.IntervalXYDataset;
/**
*@见https://stackoverflow.com/a/54362133/230513
*@见https://stackoverflow.com/a/42612723/230513
*/
公开课考试{
公共静态void main(字符串[]args){
invokeLater(新测试()::显示);
}
专用void display(){
JFrame f=新的JFrame(“数据”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 setLayout(新的GridLayout(0,1));
IntervalXYDataset数据集=createDataset();
f、 添加(createPanel(ChartFactory.createXYBarChart(“数据”、“时间”、true、“值”、数据集));
f、 添加(createPanel(ChartFactory.createTimeSeriesChart(“数据”、“时间”、“值”、“数据集”));
f、 包装();
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
私有图表面板createPanel(JFreeChart图表){
最终XYPlot=chart.getXYPlot();
最终DateAxis domainAxis=(DateAxis)plot.getDomainAxis();
domainAxis.setTickUnit(新的DateTickUnit(DateTickUnitType.YEAR,1));
domainAxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);
setDateFormatOverride(新的SimpleDataFormat(“yyyy”);
返回新图表面板(图表){
@凌驾
公共维度getPreferredSize(){
返回新尺寸(500250);
}
};
}
私有IntervalXYDataset createDataset(){
TimeSeries系列=新的TimeSeries(“值”);
Calendar c=Calendar.getInstance();
对于(int i=0;i<7;i++){
series.add(新年(c.getTime()),i+1);
c、 添加(日历年,1);
}
返回新的时间体验集合(系列);
}
}
还可以看到使用工厂与手动构建的比较结果。@塔什戈德非常感谢,我曾尝试为standardbarpainter
实现您的答案,但由于我使用了xybillander
@ga4696:很高兴它有帮助;如图所示,使用标准XYBARPAITOR
,或编写合适的出厂方法,以获得哑光外观。
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickMarkPosition;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.DateTickUnitType;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.time.Year;
import org.jfree.data.xy.IntervalXYDataset;
/**
* @see https://stackoverflow.com/a/54362133/230513
* @see https://stackoverflow.com/a/42612723/230513
*/
public class Test {
public static void main(String[] args) {
EventQueue.invokeLater(new Test()::display);
}
private void display() {
JFrame f = new JFrame("Data");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new GridLayout(0, 1));
IntervalXYDataset dataset = createDataset();
f.add(createPanel(ChartFactory.createXYBarChart("Data", "Time", true, "Value", dataset)));
f.add(createPanel(ChartFactory.createTimeSeriesChart("Data", "Time", "Value", dataset)));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private ChartPanel createPanel(JFreeChart chart) {
final XYPlot plot = chart.getXYPlot();
final DateAxis domainAxis = (DateAxis) plot.getDomainAxis();
domainAxis.setTickUnit(new DateTickUnit(DateTickUnitType.YEAR, 1));
domainAxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);
domainAxis.setDateFormatOverride(new SimpleDateFormat("yyyy"));
return new ChartPanel(chart) {
@Override
public Dimension getPreferredSize() {
return new Dimension(500, 250);
}
};
}
private IntervalXYDataset createDataset() {
TimeSeries series = new TimeSeries("Value");
Calendar c = Calendar.getInstance();
for (int i = 0; i < 7; i++) {
series.add(new Year(c.getTime()), i + 1);
c.add(Calendar.YEAR, 1);
}
return new TimeSeriesCollection(series);
}
}