代码之家  ›  专栏  ›  技术社区  ›  Beliaev Maksim

用python绘制4d图

  •  0
  • Beliaev Maksim  · 技术社区  · 8 年前

    我知道我在打一匹死马,但我找不到合适的答案。

    我想用大数据绘制一个图:

    X-Coord   Y-Coord   Z-Coord   Value
    20'000 rows
    

    当我调用

    X, Y = np.meshgrid(X, Y)
    

    我得到一个错误:

      Traceback (most recent call last):
      File "new 1.py", line 17, in <module>
        X, Y = np.meshgrid(X, Y)  # <-- returns a 2D grid from initial 1D arrays
      File "C:\Program Files (x86)\lib\site-packages\numpy\lib\function_base.py", line 4698, in meshgrid
        output = [x.copy() for x in output]
      File "C:\Program Files (x86)\lib\site-packages\numpy\lib\function_base.py", line 4698, in <listcomp>
        output = [x.copy() for x in output]
    MemoryError
    

    实际上,我只想从x y z坐标得到一个三维曲面,然后从这个坐标中的列值绘制值。请给我一个建议

    UPD: 数据示例

              X                       Y                       Z                     Value
    -3.6296815834229800E+13 9.0179395964544800E+13  4.3243022996875400E+13  2.3293827867020395e-03
    -3.6546185417114900E+13 8.9339697982272400E+13  4.3845054348437700E+13  2.2153085734286245e-03
    -3.6546185417114900E+13 9.2024057357272400E+13  4.3845054348437700E+13  2.6335681277863542e-03
    -3.6795554999999900E+13 8.8500000000000000E+13  4.4447085699999900E+13  2.2448110225069475e-03
    -3.6795554999999900E+13 9.1184359374999900E+13  4.4447085699999900E+13  2.3661800082893664e-03
    -3.6795554999999900E+13 9.3868718749999900E+13  4.4447085699999900E+13  3.1766708204588683e-03
    -3.6296815834229800E+13 9.0179395964544800E+13  4.3243022996875400E+13  2.3293827867020395e-03
    -3.6546185417114900E+13 9.2024057357272400E+13  4.3845054348437700E+13  2.6335681277863542e-03
    -3.6337452147547400E+13 9.0857342861310100E+13  4.3341127722985300E+13  2.4227047423936087e-03
    -3.6795554999999900E+13 9.3868718749999900E+13  4.4447085699999900E+13  3.1766708204588683e-03
    -3.6586821730432500E+13 9.2702004254037600E+13  4.3943159074547600E+13  2.8272105071883709e-03
    -3.6378088460865000E+13 9.1535289758075300E+13  4.3439232449095200E+13  2.5588155147357474e-03
    -3.6378088460865000E+13 9.1535289758075300E+13  4.3439232449095200E+13  2.6341575316456271e-03
    -3.6586821730432500E+13 9.2702004254037600E+13  4.3943159074547600E+13  2.8628186103490019e-03
    -3.6491956423152800E+13 9.3434980585604900E+13  4.3714133992590100E+13  3.2129310022084552e-03
    -3.6795554999999900E+13 9.3868718749999900E+13  4.4447085699999900E+13  3.1710978217960057e-03
    -3.6700689692720300E+13 9.4601695081567300E+13  4.4218060618042400E+13  3.5478526100425675e-03
    -3.6605824385440600E+13 9.5334671413134600E+13  4.3989035536084900E+13  3.9315260648101454e-03
    -3.6196152400000000E+13 8.8500000000000000E+13  4.3000000000000000E+13  5.1978166985800038e-03
    -3.6495853699999900E+13 8.8500000000000000E+13  4.3723542849999900E+13  4.8689291409766524e-03
    

    UPD2: 感谢@importanceofbeingernest提供的良好解决方案

    最后,为了在分散循环期间加快数据处理速度,我减少了阵列并使用了另一个后端。还为结果添加了颜色条。

    import numpy as np
    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    from matplotlib import cm
    
    import matplotlib
    matplotlib.use('svg')
    
    x,y,z,v = np.loadtxt("datafile.txt", skiprows=2, unpack=True)
    if len(x) > 400000:
      x = x[::50] 
      y = y[::50] 
      z = z[::50]
      v = v[::50] 
    elif len(x) > 200000:
      x = x[::20] 
      y = y[::20] 
      z = z[::20]
      v = v[::20] 
    elif len(x) > 100000:
      x = x[::10] 
      y = y[::10] 
      z = z[::10]
      v = v[::10]   
    
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    
    
    ax.scatter(x,y,z,c=v, s=10, cmap=cm.rainbow)
    
    m = cm.ScalarMappable(cmap=cm.rainbow)
    
    m.set_array(v)
    cbar = plt.colorbar(m)
    
    plt.show()
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   ImportanceOfBeingErnest    8 年前

    您可以使用散点图根据表的最后一列绘制带颜色的点;然后 plot_trisurf 可以用来得到曲面交叉的概念。

    import numpy as np
    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    
    x,y,z,v = np.loadtxt("datafile.txt", skiprows=1, unpack=True)
    
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    ax.plot_trisurf(x,y,z, edgecolor="gray", color="None")
    ax.scatter(x,y,z,c=v, s=100)
    

    enter image description here