【问题标题】:Using achartengine, how can I set the x-axis values without using x labels?使用 achartengine,如何在不使用 x 标签的情况下设置 x 轴值?
【发布时间】:2013-12-15 01:46:16
【问题描述】:

对于我的 Android 应用程序,我需要让 x 轴代表频率轴。目前,我暂时使用 myRenderer.setXlabels() 。但是,这对我的应用程序来说不够有效,因为一旦设置了最小和最大 x 轴标签,如果缩小图形,则在最小 X 标签的左侧和右侧没有 x 轴值的最大 X 标签。此外,如果放大,则仅存在我明确具有程序标签的 x 轴值。因此,如果您放大至少 2 倍,则不会显示 x 轴值 = :(

在 AChartEngine Demo 应用程序中,他们有一个三角函数示例,其中绘制了 0 到 360 度的正弦和余弦波。与此示例类似,我希望我的频率轴从 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 轴值)。

【问题讨论】:

  • 我认为您应该添加屏幕截图或其他内容来说明您的需求。
  • 我尝试添加图片,但显然我没有足够的“声誉点”来发布图片。所以也许如果你有 Matlab,你可以复制上面的代码并运行脚本来直观地理解我正在尝试使用 AChartEngine 库来实现什么。
  • 现在尝试添加图像。我不想拥有 Matlab。
  • 谢谢。希望图片有帮助:)

标签: android graph achartengine


【解决方案1】:

您可以使用以下方法添加自定义标签:

renderer.addXTextLabel(x, "text");

如果您只想要自定义标签,则可以禁用默认标签:

renderer.setXLabels(0);

【讨论】:

  • 我很欣赏这个建议,但我感兴趣的是实际的轴值,而不是使用文本字符串来标记轴值。
  • 您可以通过使用 setXLabels 参数来控制它。
  • “setXLabels(int number)”通过使文本标签在每个 x 轴标签之间具有相等的间距(宽度)来工作。例如,我可以说“setXLabels(8)”,渲染器将在绘图上显示 8 个等距的 x 轴值。但是,使用文本标签(并删除常规 x 轴值)仅显示指定值的文本,而不是整个轴。因此,如果缩小,则轴值不存在。同样,如果放大,则不存在更具体的值。但是,我最终找到了我的问题的解决方案,并将其发布在下面。有兴趣的可以去看看。
  • 您可以监听平移和缩放事件并即时更新自定义标签。我在您的解决方案中看不到任何与标签相关的内容。
  • +1 renderer.setXLabels(0); 是我想要的!谢谢
【解决方案2】:

好吧,我解决了我自己的问题。由于在发布此问题之前我在 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);
    }
}

【讨论】:

    【解决方案3】:

    正如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;
     }
    

    希望这能解决,如果有任何问题评论...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      相关资源
      最近更新 更多