В настоящее время я использую реализацию расширенного алгоритма Уилкинсона для генерации последовательности значений тиков по оси.Для этого алгоритму присваивается диапазон значений [min, max] и число n желаемых значений отметок, затем он выводит массив равномерно распределенных значений в интервале [min, max].Что мне нужно сделать, это создать метки String из этих значений, НО в зависимости от порядка величины этих значений. Я бы хотел переключиться между научной и десятичной нотациями.
Например, для последовательности {0.00001, 0,000015, 0,00002, 0,000025} Я хотел бы использовать научную запись {'1.0e-05', '1.5e-05', '2.0e-05', '2.5e-05'}.Для последовательности {0,8,16,24,32} я хотел бы отобразить ее в виде десятичной записи.Я также не хочу ненужных конечных нулей, таких как 0,001000 или 1,500e-05, но в случае приведенного выше примера научной нотации я хочу один завершающий ноль, когда другие числа должны использовать больше десятичных разрядов.например, «1,00e-05» и «1,05e-05».Но подождите, есть больше, например, для {20.0000001, 20.0000002, 20.0000003} интересная часть, конечно, очень маленькое отклонение 0,0000001 для каждого значения, но значение 20 все еще важно, может быть желательно что-то вроде '20 + 1,0e-07'потому что подсчет нулей утомителен.Смешивание научных и десятичных чисел в метках также не приветствуется, например, {8000, 9000, 1.0e04, 1.1e04} - это плохо.
Цель состоит в том, чтобы иметь последовательную маркировку, которая позволяет различать значения и которая можетбыть прочитанным так, чтобы очень маленькие или очень большие значения были представлены в научной нотации для экономии места на дисплее.
Таким образом, представление, которое следует использовать для последовательности, не зависит от самого одного значения, но вся последовательность должнабыть принятым во внимание. Имеется ли пакет программного обеспечения или какой-либо исследовательский документ, касающийся этого вопроса?
Я пытался реализовать что-то сам, но это не очень хорошо работает, иногда он выдает те же строкидля разных чисел, например, '86 .0001 ', '86 .0001', '86 .0002 ', '86 .0002' для {86.0001, 86.00015, 86.0002, 86.00025}.
protected String[] labelsForTicks(double[] ticks){
String str1 = String.format(Locale.US, "%.4g", ticks[0]);
String str2 = String.format(Locale.US, "%.4g", ticks[ticks.length-1]);
String[] labels = new String[ticks.length];
if(str1.contains("e") || str2.contains("e")){
for(int i=0; i<ticks.length; i++){
String l = String.format(Locale.US, "%.4e", ticks[i]);
String[] Esplit = l.split("e", -2);
String[] dotsplit = Esplit[0].split("\\.",-2);
dotsplit[1] = ('#'+dotsplit[1])
.replaceAll("0", " ")
.trim()
.replaceAll(" ", "0")
.replaceAll("#", "");
dotsplit[1] = dotsplit[1].isEmpty() ? "0":dotsplit[1];
l = dotsplit[0]+'.'+dotsplit[1]+'e'+Esplit[1];
labels[i] = l;
}
} else {
for(int i=0; i<ticks.length; i++){
String l = String.format(Locale.US, "%.4f", ticks[i]);
if(l.contains(".")){
String[] dotsplit = l.split("\\.",-2);
dotsplit[1] = ('#'+dotsplit[1])
.replaceAll("0", " ")
.trim()
.replaceAll(" ", "0")
.replaceAll("#", "");
if(dotsplit[1].isEmpty()){
l = dotsplit[0];
} else {
l = dotsplit[0]+'.'+dotsplit[1];
}
}
labels[i] = l;
}
}
return labels;
}
Он пытается решить, использовать ли научную или десятичную записьиспользуя строковый формат 'g' для первого и последнего значения в последовательности, а затем пытается удалить ненужные нули.