对于我的Android应用程序,我需要让x轴代表频率轴。目前,我暂时使用myRenderer.setXlabels()。但是,这对我的应用程序来说效率不高,因为一旦设置了最小和最大x轴标签,如果缩小图形,则min X标签左侧没有x轴值,右边最大X标签。此外,如果放大,则只存在我明确拥有程序标签的x轴值。因此,如果放大至少2次,则没有显示的x轴值= :(
在AChartEngine Demo应用程序中,它们具有三角函数示例,其中它们绘制从0到360度的sin和cos波。与此示例类似,我希望我的频率轴从0到采样频率的一半,即22050(22.05e3),这样,如果放大或缩小,相对于数据点始终存在x轴值
我将绘制的数据点数量通常非常大(大致相当于10,000 - 40,000点),但我一次只需要在图表中绘制一行(或一系列)数据。
如果有人知道如何在不使用标签的情况下做到这一点,我将不胜感激。 :)
BELOW - 用于表示频率轴的含义的Matlab代码:
x = [0 5 -5 3 -3 1 -1 0];
X = fft(x);
absX = abs(X);
subplot(2,1,1)
plot(abs_X)
title('(a) General x-axis')
freq_axis = linspace(0,22.05e3,8);
subplot(2,1,2)
plot(freq_axis,abs_X)
title('(b) Frequency x-axis (Linearly-spaced)')
通过Matlab定义:
linspace - 线性间隔矢量。
linspace(X1,X2)在X1和X2之间生成100个线性等间距点的行向量。
linspace(X1,X2,N)在X1和X2之间生成N个点。 对于N = 1,linspace返回X2。
因此,在更简单的上下文中,我只想弄清楚如何更改x轴值以表示其他数值(从时域x值转换为频域x轴值)。
答案 0 :(得分:2)
您可以使用以下方式添加自定义标签:
renderer.addXTextLabel(x, "text");
如果您只想要自定义标签,则可以禁用默认标签:
renderer.setXLabels(0);
答案 1 :(得分:0)
好吧,我解决了自己的问题。由于在发布此问题之前我无法在stackoverflow.com上找到太多帮助,我将提供我的解决方案,其他任何人都对如何更改x(或y)轴上的数值感到好奇强>
/**
* sampling frequency
*/
private final int fs = 44100;
/**
* last x-value, (starting x-value = 0)
*/
private final int endValue = fs/2;
public XYMultipleSeriesDataset getFrequencyAxis(double[] fftData) {
XYMultipleSeriesDataset rangeData = new XYMultipleSeriesDataset();
String[] titles = new String[] { "FFT data" }; // titles of data
List<double[]> xAxis = new ArrayList<double[]>(1); // x-axis values
List<double[]> values = new ArrayList<double[]>(1); // y-axis values
// Need to have just as many x values as y values
xAxis.add(new double[fftData.length]);
values.add(new double[fftData.length]);
// Linearly-spaced x-axis values -> increment must be kept constant
double increment = (endValue)/fftData.length; // (fs/2)/length of data
for(int i =0; i < fftData.length; i++) {
xAxis.get(0)[i] = i * increment;
values.get(0)[i] = fftData[i];
}
// for the buildDataset method call:
rangeData = dataBuilder(titles, xAxis, values);
return rangeData;
}
private XYMultipleSeriesDataset dataBuilder(String[] titles,
List<double[]> xValues, List<double[]> yValues) {
XYMultipleSeriesDataset dataset1 = new XYMultipleSeriesDataset();
addXYSeries(dataset1, titles, xValues, yValues, 0);
return dataset1;
}
private void addXYSeries(XYMultipleSeriesDataset dataset, String[] titles,
List<double[]> xValues, List<double[]> yValues, int scale) {
int length = titles.length; // # of series to add to plot
for (int i = 0; i < length; i++) {
// maps the x-axis values to their respective y-axis values
double[] xV = xValues.get(i);
XYSeries series = new XYSeries(titles[i], scale);
double[] yV = yValues.get(i);
int seriesLength = xV.length;
for (int k = 0; k < seriesLength; k++) {
series.add(xV[k], yV[k]);
}
dataset.addSeries(series);
}
}
答案 2 :(得分:0)
正如Dan in his answer所述,您可以使用renderer.addXTextLabel(x, "text");
来设置x轴值。
在你的情况下::
你需要频率所以试试这个......
for(int i=0; i< x.Length; i++)
{
multiRenderer.addXTextLabel(i, Getfreq(x[i]));
}
其中Getfreq(x[i])
是为x
的不同值生成不同频率并返回字符串以在x轴上显示的另一种方法。
public String Getfreq(int i)
{
//put the android code to calculate frequency
freqxlable = Freq(i); //put actual function that will calculate frequency
Srting s = freqxlable +"":
return s;
}
希望这会解决,如果有任何问题评论......