Ни один из существующих ChartFactory
не использует XYSplineRenderer
, и я не был уверен в ваших существующих наборах данных. Я начал с этого примера и выбрал нормальное распределение, например , это , чтобы получить оригинальный пример, показанный здесь . Возможно, вам придется настроить precision
в соответствии с вашими данными. При необходимости вы можете изменить метки оси домена, используя любой из методов, предложенных в . Как я могу изменить tickLabel
на NumberAxis
…? .
Мой набор данных использует
blockquote>int String String
Чтение более близко, первый
String
- это ключ серии, который я обозначил"Frequency"
; второй представляется числовым диапазоном. Этот новый пример иллюстрирует использование более высокой точности иSymbolAxis
, который должен работать лучше для ваших дюжин или около того диапазонов.Обновленный пример:
import java.awt.Dimension; import java.awt.EventQueue; import javax.swing.JFrame; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.SymbolAxis; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYSplineRenderer; import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; /** * @see https://stackoverflow.com/a/55418498/230513 * @see https://stackoverflow.com/a/14790187/230513 * @see https://stackoverflow.com/a/40167139/230513 */ public class SplineTest { public static final String Title = "Spline Test"; public static void main(String[] args) { EventQueue.invokeLater(new SplineTest()::display); } private void display() { XYSeries series = new XYSeries("Frequency"); series.add(0, 1); series.add(1, 1); series.add(2, 3); series.add(3, 7); series.add(4, 11); series.add(5, 21); series.add(6, 28); series.add(7, 16); series.add(8, 22); series.add(9, 7); series.add(10, 1); series.add(11, 2); XYDataset dataset = new XYSeriesCollection(series); String[] labels = new String[series.getItemCount()]; labels[0] = "<46"; labels[1] = "46-55"; labels[2] = "56-65"; labels[3] = "66-75"; labels[4] = "76-85"; labels[5] = "86-95"; labels[6] = "96-105"; labels[7] = "106-115"; labels[8] = "116-125"; labels[9] = "126-135"; labels[10] = "136-145"; labels[11] = ">146"; NumberAxis domain = new SymbolAxis("X", labels); NumberAxis range = new NumberAxis("Y"); XYSplineRenderer r = new XYSplineRenderer(8); XYPlot xyplot = new XYPlot(dataset, domain, range, r); JFreeChart chart = new JFreeChart(xyplot); ChartPanel chartPanel = new ChartPanel(chart) { @Override public Dimension getPreferredSize() { return new Dimension(640, 480); } }; JFrame frame = new JFrame(Title); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(chartPanel); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }
Так, Вы не должны думать обо всем этом сразу. Сначала сделайте свою форму в передней стороне HTML и центре на странице, присоедините действие и заставьте это работать без Модальной причудливости.
После того как Ваша логика формы работает, можно циклично выполниться в jQuery. Хотите ли Вы запуститься с модальности, и всплывающее окно или с Асинхронного Сообщения с jQuery ваше дело. Мне обычно нравится заставлять его работать, прежде чем я сделаю это симпатичным, таким образом, мы будем следовать тем маршрутом. Если Вы используете стандарт <HTML %. BeginForm... {%> синтаксис для определения формы удалите его. Пойдите старый школьный HTML! (Я знаю, что можно далее настроить HTML. Beginform, но легче просто использовать HTML),
<form action="<%= Url.ActionLink(...)%>" id="SomeForm">
Теперь можно обеспечить электричеством jQuery в document.ready, или везде, где Вы инициализируете свой JS.
$('#SomeForm').bind('submit', youractionfunction);
В Вашей форме действия Вы будете, вероятно, называть сообщение jQuery, где обратный вызов сообщения скрывает Вашу форму и обновляет остальную часть страницы. Документация API
function youractionfunction(e){
$.post($(e).attr('action'), // we get the action attribute (url) from the form
{ title : $('#titleBox').val()}, // the values we're passing
yourCallbackFunction);
return false; // This is important, this will stop the event from bubbling and your form from submitting twice.
}
Теперь у Вас есть форма ajaxy, таким образом, можно работать над обратным вызовом.
function yourCallbackFunction(data)
{
// do something with the result.
}
Теперь мы можем говорить о модальности. Это обычно - что-то вроде боли, но можно использовать плагин jQuery как это или что-то подобное, чтобы сделать это для Вас. Затем это - просто вопрос обеспечения электричеством событий, чтобы показать и скрыть всплывающее окно, и Вы все установлены.
Если Ваше намерение состояло в том, чтобы иметь ту форму, загруженную асинхронно, когда на "выставочную" ссылку нажимают, это немного более неприятно, но все еще выполнимо. Можно использовать jQuery. Загрузитесь (документация API), чтобы вытянуть HTML и ввести его в dom, но необходимо будет все еще обеспечить электричеством события (снова, со связыванием ('отправьте'...) описанный выше).