【问题标题】:What is the best method for using Datashader to plot data from a NumPy array?使用 Datashader 从 NumPy 数组中绘制数据的最佳方法是什么?
【发布时间】:2017-02-10 14:59:46
【问题描述】:

Datashader 示例notebook demonstrating lines 之后,输入是 Pandas DataFrame(尽管 Dask DataFrame 似乎也可以工作)。我的数据在 NumPy 数组中。我可以使用 Datashader 从 NumPy 数组中绘制线条,而无需先将它们放入 DataFrame 中吗?

line glyph 的文档似乎表明这是可能的,但我没有找到示例。我链接到的示例笔记本使用了我在文档中没有找到的Canvas.line

【问题讨论】:

    标签: python numpy dataframe datashader


    【解决方案1】:

    我没有找到一种在 NumPy 数组中绘制数据而不先将其放入 DataFrame 的方法。如何做到这一点并不是特别直观,似乎 Datashader 要求列标签是非数字字符串,因此可以使用 df.col_label 语法调用它们(而不是 df[col_label] 语法,也许有一个很好的理由不过这个)。

    使用当前系统,我必须执行以下操作才能将 NumPy 数组放入 DataFrame 中,其中列标签 Datashader 可以接受。

    df = pd.DataFrame(data=data.T)
    data_cols = ['c{}'.format(c) for c in df.columns]
    df.columns = data_cols
    df['x'] = x_values
    
    y_range = data.min(), data.max()
    x_range = x_values[0], x_values[-1]
    
    canvas = datashader.Canvas(x_range=x_range, y_range=y_range, 
                               plot_height=300, plot_width=900)
    aggs = collections.OrderedDict((c, canvas.line(df, 'q', c)) for c in data_cols)
    
    merged = xarray.concat(saxs_aggs.values(), dim=pd.Index(cols, name='cols'))
    saxs_img = datashader.transfer_functions.shade(merged.sum(dim='cols'), 
                                                   how='eq_hist')
    

    请注意,data_cols 变量的使用很重要,而不仅仅是 df.columns,因为它必须排除 x 列(最初并不直观)。

    这是一个使用散景添加轴的结果示例。

    【讨论】:

    • 感谢您的反馈!我不知道有什么方法可以使用原始 NumPy 数组,但是在 Github 站点上将其作为问题提交是一个合理的功能请求。提出有关使用数字列名的问题也会有所帮助;除了方便之外,我认为我们没有任何特别的理由使用 col_label 语法,而且到目前为止我们还没有遇到过纯数字列标签。总的来说,Github issues 是一种更好的与我们交流的方式,这样我们就可以随着时间的推移跟踪 cmets。
    • @JamesA.Bednar 对于操作方法,我更喜欢询问有关堆栈溢出的问题,部分是为了帮助他人,也是出于自私的原因,即有一个易于访问的参考可以返回。您想将问题提交为 Github 问题吗?我认为这通常是不鼓励的。我将提出一个与列标签和接受 numpy 数组的想法相关的问题。
    • SO 非常适合使用问题,如果您认为必须已经有一种方法可以做某事,并且您只需要有人帮助您弄清楚那是什么。但是对于数据着色器开发人员来说,SO 是一种糟糕的方式来跟踪功能请求和错误报告,如果他们坐在一些随机的 SO 帖子中,这两者都不太可能得到解决。当然,通常很难判断您处于哪种情况,即是您自己的理解还是软件本身的问题。在这种情况下,需要改进的是软件,而不是你,所以请提交github问题。
    【解决方案2】:

    OrderedDictxarray.concat 方法在应用于许多数据曲线时速度非常慢。下面的示例演示了一种更快的方法。有关时间安排和进一步讨论,请参阅this GitHub issue

    import pandas as pd
    import numpy as np
    import datashader
    import bokeh.plotting
    import collections
    import xarray
    import time
    from bokeh.palettes import Colorblind7 as palette
    
    bokeh.plotting.output_notebook()
    
    # create some data worth plotting
    nx = 50
    x = np.linspace(0, np.pi * 2, nx)
    y = np.sin(x)
    n = 10000
    data = np.empty([n+1, len(y)])
    data[0] = x
    prng = np.random.RandomState(123)
    
    # scale the data using a random normal distribution
    offset = prng.normal(0, 0.1, n).reshape(n, -1)
    data[1:] = y
    data[1:] += offset
    
    # make some data noisy
    n_noisy = prng.randint(0, n,5)
    for i in n_noisy:
        data[i+1] += prng.normal(0, 0.5, nx)
    
    dfs = []
    split = pd.DataFrame({'x': [np.nan]})
    for i in range(len(data)-1):
        x = data[0]
        y = data[i+1]
        df = pd.DataFrame({'x': x, 'y': y})
        dfs.append(df)
        dfs.append(split)
    
    df = pd.concat(dfs, ignore_index=True)   
    
    canvas = datashader.Canvas(x_range=x_range, y_range=y_range, 
                               plot_height=300, plot_width=300)
    agg = canvas.line(df, 'x', 'y', datashader.count())
    img = datashader.transfer_functions.shade(agg, how='eq_hist')
    img
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      相关资源
      最近更新 更多