~ 2,000 만 개의 샘플 포인트와 기가 바이트의 데이터가 포함 된 대화 형 대형 플롯


80

여기에 문제가 있습니다 (RAM에). 내가 플로팅하려는 데이터를 보유 할 수 없습니다. HD 공간이 충분합니다. 내 데이터 세트의 "그림자"를 피할 수있는 해결책이 있습니까?

구체적으로 저는 디지털 신호 처리를 다루고 있으며 높은 샘플 속도를 사용해야합니다. 내 프레임 워크 (GNU Radio)는 값을 바이너리로 저장합니다 (너무 많은 디스크 공간 사용을 방지하기 위해). 포장을 풉니 다. 나중에 플롯해야합니다. 확대 / 축소 가능한 대화 형 플롯이 필요합니다. 그리고 그것은 문제입니다.

이것 또는 더 큰 데이터 세트를 처리 할 수있는 다른 소프트웨어 / 프로그래밍 언어 (예 : R 등)에 대한 최적화 가능성이 있습니까? 사실 저는 제 플롯에 더 많은 데이터를 원합니다. 하지만 다른 소프트웨어에 대한 경험이 없습니다. GNUplot은 다음과 비슷한 접근 방식으로 실패합니다. 나는 R (제트기)을 모른다.

import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
import struct

"""
plots a cfile

cfile - IEEE single-precision (4-byte) floats, IQ pairs, binary
txt - index,in-phase,quadrature in plaintext

note: directly plotting with numpy results into shadowed functions
"""

# unpacking the cfile dataset
def unpack_set(input_filename, output_filename):
    index = 0   # index of the samples
    output_filename = open(output_filename, 'wb')

    with open(input_filename, "rb") as f:

        byte = f.read(4)    # read 1. column of the vector

        while byte != "":
        # stored Bit Values
            floati = struct.unpack('f', byte)   # write value of 1. column to a variable
            byte = f.read(4)            # read 2. column of the vector
            floatq = struct.unpack('f', byte)   # write value of 2. column to a variable
            byte = f.read(4)            # next row of the vector and read 1. column
            # delimeter format for matplotlib 
            lines = ["%d," % index, format(floati), ",",  format(floatq), "\n"]
            output_filename.writelines(lines)
            index = index + 1
    output_filename.close
    return output_filename.name

# reformats output (precision configuration here)
def format(value):
    return "%.8f" % value            

# start
def main():

    # specify path
    unpacked_file = unpack_set("test01.cfile", "test01.txt")
    # pass file reference to matplotlib
    fname = str(unpacked_file)
    plt.plotfile(fname, cols=(0,1)) # index vs. in-phase

    # optional
    # plt.axes([0, 0.5, 0, 100000]) # for 100k samples
    plt.grid(True)
    plt.title("Signal-Diagram")
    plt.xlabel("Sample")
    plt.ylabel("In-Phase")

    plt.show();

if __name__ == "__main__":
    main()

plt.swap_on_disk ()와 같은 것이 내 SSD의 내용을 캐시 할 수 있습니다.)


"그림자 함수에 numpy 결과를 직접 플로팅" 한다는 것은 무엇을 의미 합니까?
jfs

2
"기가 바이트"의 데이터를 얻는 방법을 이해하지 못합니다. 2,000 만 x (3 x (4 바이트)) = 240MB, 맞습니까? 그리고 @EOL은 완전히 옳습니다. 완벽하게 좋은 바이너리 데이터를 텍스트 형식으로 변환하는 것은 시간과 I / O를 완전히 낭비하는 것입니다. numpy를 사용하여 바이너리에 직접 액세스하십시오.
Jonathan Dursi 2011 년

이상합니다. floati와 floatq를 어디에도 저장하지 않습니까? 아니면 'lines'로 시작하는 줄이 while 루프 안에 있다는 뜻입니까?
K.-Michael Aye

편집을위한 6 개의 비 공백 문자 규칙 때문에 편집 할 수 없다는 것이 흥미 롭습니다. 때로는 4 개의 공백 만 있으면 코드가 완전히 작동하지 않게됩니다 ...;)
K.-Michael Aye

답변:


91

따라서 데이터가 그다지 크지 않으며 데이터를 그리는 데 문제가 있다는 사실은 도구에 문제가 있음을 나타냅니다. Matplotlib에는 많은 옵션이 있으며 출력은 괜찮지 만 엄청난 메모리 소모이며 기본적으로 데이터가 작다고 가정합니다. 그러나 거기에는 다른 옵션이 있습니다.

예를 들어 다음을 사용하여 20M 데이터 포인트 파일 'bigdata.bin'을 생성했습니다.

#!/usr/bin/env python
import numpy
import scipy.io.numpyio

npts=20000000
filename='bigdata.bin'

def main():
    data = (numpy.random.uniform(0,1,(npts,3))).astype(numpy.float32)
    data[:,2] = 0.1*data[:,2]+numpy.exp(-((data[:,1]-0.5)**2.)/(0.25**2))
    fd = open(filename,'wb')
    scipy.io.numpyio.fwrite(fd,data.size,data)
    fd.close()

if __name__ == "__main__":
    main()

이렇게하면 크기가 229MB 이하인 파일이 생성됩니다. 그러나 더 큰 파일로 이동하고 싶다고 표현 했으므로 결국 메모리 제한에 도달하게됩니다.

먼저 비대화 형 플롯에 집중하겠습니다. 가장 먼저 깨달아야 할 점은 각 지점에 글리프가있는 벡터 플롯이 재앙이 될 것이라는 것입니다. 20M 지점 각각에 대해 대부분은 어쨌든 겹칠 것이며 작은 십자가 나 원을 렌더링하려고 시도하는 것입니다. 거대한 파일을 생성하고 많은 시간이 소요됩니다. 이것은 기본적으로 matplotlib를 싱킹하는 것이라고 생각합니다.

Gnuplot은이를 처리하는 데 아무런 문제가 없습니다.

gnuplot> set term png
gnuplot> set output 'foo.png'
gnuplot> plot 'bigdata.bin' binary format="%3float32" using 2:3 with dots

gnuplot

그리고 Matplotlib도 약간의주의를 기울여 작동하도록 만들 수 있습니다 (래스터 백엔드를 선택하고 픽셀을 사용하여 포인트를 표시).

#!/usr/bin/env python
import numpy
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

datatype=[('index',numpy.float32), ('floati',numpy.float32), 
        ('floatq',numpy.float32)]
filename='bigdata.bin'

def main():
    data = numpy.memmap(filename, datatype, 'r') 
    plt.plot(data['floati'],data['floatq'],'r,')
    plt.grid(True)
    plt.title("Signal-Diagram")
    plt.xlabel("Sample")
    plt.ylabel("In-Phase")
    plt.savefig('foo2.png')

if __name__ == "__main__":
    main()  

matplotlib

이제 대화 형을 원하면 플로팅 할 데이터를 비닝하고 즉시 확대해야합니다. 이 작업을 직접 수행하는 데 도움이 될 파이썬 도구는 없습니다.

반면에 빅 데이터 플로팅은 매우 일반적인 작업이며 작업에 적합한 도구가 있습니다. Paraview 는 개인적으로 좋아하는 것이고 VisIt 은 또 다른 것입니다. 둘 다 주로 3D 데이터 용이지만 Paraview는 특히 2d도 수행하며 매우 상호 작용하며 Python 스크립팅 인터페이스도 있습니다. 유일한 트릭은 Paraview가 쉽게 읽을 수있는 파일 형식으로 데이터를 쓰는 것입니다.


2
좋은 게시물입니다. +1 for VisIt 및 ParaView 언급-그들은 (매우!) 큰 데이터 세트를 처리하도록 설계된 유용하고 강력한 시각화 프로그램입니다. VisIt에는 Python 스크립팅 인터페이스도 있으며 2D 및 3D 플롯 (곡선) 외에도 1D를 그릴 수 있습니다. 파일 형식 측면에서 VTK는 두 프로그램 모두 지원하는 비교적 간단한 형식입니다 (실제로 ParaView는 VTK 라이브러리에 구축 됨).
Chris

2
보케 Datashader을 확인하는 "회전 이미지로도 가장 큰 데이터" github.com/bokeh/datashader
tommy.carstensen

3
Paraview와 VisIt을 언급 해 주셔서 감사합니다. 둘 다 다음에서 언급 된 2D 사용 사례를 다룰 수있었습니다. stackoverflow.com/a/55967461/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

40

Ubuntu에서 천만 점 산점도 벤치 마크를 사용하는 오픈 소스 대화 형 플로팅 소프트웨어 설문 조사

: 사용 사례에서 영감은 설명 /stats/376361/how-to-find-the-sample-points-that-have-statistically-meaningful-large-outlier-r 내가 벤치마킹 한 다음과 같은 매우 간단하고 순진한 천만 점의 직선 데이터로 몇 가지 구현 :

i=0;
while [ "$i" -lt 10000000 ]; do
  echo "$i,$((2 * i)),$((4 * i))"; i=$((i + 1));
done > 10m.csv

처음 몇 줄은 10m.csv다음과 같습니다.

0,0,0
1,2,4
2,4,8
3,6,12
4,8,16

기본적으로 다음을 원했습니다.

  • Z를 포인트 색상으로 사용하여 다차원 데이터의 XY 산점도를 수행하십시오.
  • 몇 가지 흥미로운 점을 대화식으로 선택
  • 선택한 포인트 (적어도 X, Y 및 Z 포함)의 모든 차원을보고 XY 산포에서 특이 치인 이유를 이해합니다.

재미를 더하기 위해 프로그램이 천만 포인트를 처리 할 수있는 경우를 대비하여 더 큰 10 억 포인트 데이터 세트도 준비했습니다! CSV 파일이 약간 불안정 해져서 HDF5로 옮겼습니다.

import h5py
import numpy

size = 1000000000

with h5py.File('1b.hdf5', 'w') as f:
    x = numpy.arange(size + 1)
    x[size] =  size / 2
    f.create_dataset('x', data=x, dtype='int64')
    y = numpy.arange(size + 1) * 2
    y[size] =  3 * size / 2
    f.create_dataset('y', data=y, dtype='int64')
    z = numpy.arange(size + 1) * 4
    z[size] = -1
    f.create_dataset('z', data=z, dtype='int64')

다음을 포함하는 ~ 23GiB 파일이 생성됩니다.

  • 직선으로 10 억 점 10m.csv
  • 그래프의 중앙 상단에 하나의 특이점

테스트는 하위 섹션에서 달리 언급하지 않는 한 Ubuntu 18.10에서 수행되었으며 Intel Core i7-7820HQ CPU (4 코어 / 8 스레드), 2x Samsung M471A2K43BB1-CRC RAM (2x 16GiB), NVIDIA Quadro M1200이 장착 된 ThinkPad P51 노트북에서 수행되었습니다. 4GB GDDR5 GPU.

결과 요약

이것은 저의 매우 구체적인 테스트 사용 사례를 고려할 때 제가 관찰 한 내용이며 검토 된 많은 소프트웨어를 처음 사용하는 사람입니다.

천만 포인트를 처리합니까?

Vaex        Yes, tested up to 1 Billion!
VisIt       Yes, but not 100m
Paraview    Barely
Mayavi      Yes
gnuplot     Barely on non-interactive mode.
matplotlib  No
Bokeh       No, up to 1m
PyViz       ?
seaborn     ?

많은 기능이 있습니까?

Vaex        Yes.
VisIt       Yes, 2D and 3D, focus on interactive.
Paraview    Same as above, a bit less 2D features maybe.
Mayavi      3D only, good interactive and scripting support, but more limited features.
gnuplot     Lots of features, but limited in interactive mode.
matplotlib  Same as above.
Bokeh       Yes, easy to script.
PyViz       ?
seaborn     ?

GUI가 기분이 좋습니까 (좋은 성능을 고려하지 않음) :

Vaex        Yes, Jupyter widget
VisIt       No
Paraview    Very
Mayavi      OK
gnuplot     OK
matplotlib  OK
Bokeh       Very, Jupyter widget
PyViz       ?
seaborn     ?

Vaex 2.0.2

https://github.com/vaexio/vaex

설치하고 다음과 같이 작동하는 hello world를 얻으십시오. Vaex에서 대화식 2D 산점도 줌 / 포인트 선택을 수행하는 방법은 무엇입니까?

나는 최대 10 억 포인트로 vaex를 테스트했고 효과가 있었다.

재현성이 뛰어나고 다른 Python 것들과 쉽게 인터페이스 할 수있는 "Python-scripted-first"입니다.

Jupyter 설정에는 몇 가지 움직이는 부분이 있지만 일단 virtualenv로 실행하면 놀랍습니다.

Jupyter에서 실행 된 CSV를로드하려면 :

import vaex
df = vaex.from_csv('10m.csv', names=['x', 'y', 'z'],)
df.plot_widget(df.x, df.y, backend='bqplot')

그리고 우리는 즉시 볼 수 있습니다.

여기에 이미지 설명 입력

이제 마우스로 포인트를 확대 / 축소, 이동 및 선택할 수 있으며 업데이트가 정말 빠릅니다. 모두 10 초 이내에 완료됩니다. 여기에서는 일부 개별 포인트를보기 위해 확대하고 그중 몇 개를 선택했습니다 (이미지에서 희미한 밝은 사각형).

여기에 이미지 설명 입력

마우스로 선택한 후에는 df.select()방법 을 사용하는 것과 똑같은 효과가 있습니다. 따라서 Jupyter에서 실행하여 선택한 점을 추출 할 수 있습니다.

df.to_pandas_df(selection=True)

다음 형식으로 데이터를 출력합니다.

        x       y        z   index
0 4525460 9050920 18101840 4525460
1 4525461 9050922 18101844 4525461
2 4525462 9050924 18101848 4525462
3 4525463 9050926 18101852 4525463
4 4525464 9050928 18101856 4525464
5 4525465 9050930 18101860 4525465
6 4525466 9050932 18101864 4525466

10M 포인트가 잘 작동했기 때문에 1B 포인트를 시도하기로 결정했습니다 ... 그리고 잘 작동했습니다!

import vaex
df = vaex.open('1b.hdf5')
df.plot_widget(df.x, df.y, backend='bqplot')

원래 플롯에서 보이지 않았던 이상 치를 관찰하기 위해 vaex 대화 형 Jupyter bqplot plot_widget에서 포인트 스타일을 어떻게 변경하여 개별 포인트를 더 크고 보이게 만들 수 있습니까? 사용 :

df.plot_widget(df.x, df.y, f='log', shape=128, backend='bqplot')

다음을 생성합니다.

여기에 이미지 설명 입력

포인트를 선택한 후 :

여기에 이미지 설명 입력

이상치의 전체 데이터를 얻습니다.

   x          y           z
0  500000000  1500000000  -1

다음은 더 흥미로운 데이터 세트와 더 많은 기능을 가진 제작자의 데모입니다. https://www.youtube.com/watch?v=2Tt0i823-ec&t=770

Ubuntu 19.04에서 테스트되었습니다.

VisIt 2.13.3

웹 사이트 : https://wci.llnl.gov/simulation/computer-codes/visit

라이센스 : BSD

National Nuclear Security Administration 인 Lawrence Livermore National Laboratory 에서 개발 연구소 인 했으므로 제가 작동하게된다면 10m 포인트가 아무 소용이 없을 것이라고 상상할 수 있습니다.

설치 : 데비안 패키지가 없습니다. 웹 사이트에서 Linux 바이너리를 다운로드하세요. 설치하지 않고 실행됩니다. 참조 : /ubuntu/966901/installing-visit

많은 고성능 그래프 소프트웨어가 사용하는 백엔드 라이브러리 인 VTK 를 기반으로 합니다. C로 작성.

UI로 3 시간을 플레이 한 후 작동하게되었고 /stats/376361/how-to-find-the-sample-에 자세히 설명 된대로 제 사용 사례를 해결했습니다. 통계적으로 의미있는 점이 큰 이상치 r

이 게시물의 테스트 데이터는 다음과 같습니다.

여기에 이미지 설명 입력

몇 가지 선택 사항이있는 확대 / 축소 :

여기에 이미지 설명 입력

다음은 추천 창입니다.

여기에 이미지 설명 입력

성능면에서 VisIt은 매우 좋았습니다. 모든 그래픽 작업은 시간이 조금 걸리거나 즉각적이었습니다. 기다려야 할 때 남은 작업 비율과 함께 "처리 중"메시지가 표시되고 GUI가 정지되지 않았습니다.

10m 포인트가 너무 잘 작동했기 때문에 100m 포인트 (2.7G CSV 파일)도 시도했지만 충돌이 발생하거나 안타깝게도 이상한 상태가되었습니다. htop 되었고 4 개의 VisIt 스레드가 내 16GiB RAM을 모두 차지하여 사망했을 가능성이 높습니다. 실패한 malloc에.

처음 시작하는 것은 약간 고통 스러웠습니다.

  • 당신이 핵폭탄 엔지니어가 아니라면 많은 디폴트가 끔찍하다고 느낍니까? 예 :
    • 기본 포인트 크기 1px (모니터의 먼지와 혼동 됨)
    • 0.0에서 1.0까지의 축 스케일 : 0.0에서 1.0 까지의 분수 대신 Visit plotting 프로그램에서 실제 축 번호 값을 표시하는 방법은 무엇입니까?
    • 다중 창 설정, 데이터 포인트를 선택할 때 불쾌한 다중 팝업
    • 사용자 이름과 플롯 날짜를 표시합니다 ( "컨트롤"> "주석"> "사용자 정보"로 제거).
    • 자동 위치 지정 기본값이 좋지 않습니다. 범례가 축과 충돌하고 제목 자동화를 찾을 수 없으므로 레이블을 추가하고 모든 것을 손으로 재배치해야했습니다.
  • 기능이 많기 때문에 원하는 것을 찾기가 어려울 수 있습니다.
  • 설명서는 매우 도움이 되었지만 "2005 년 10 월 버전 1.5"라는 불길한 날짜의 386 페이지 PDF입니다. 나는 그들이 삼위 일체 를 개발하기 위해 이것을 사용했는지 궁금합니다 ! 그리고 그것은이다 좋은 스핑크스 HTML은 내가 처음이 질문에 대답 한 후 방금 만든이
  • Ubuntu 패키지가 없습니다. 그러나 미리 빌드 된 바이너리는 제대로 작동했습니다.

나는 이러한 문제를 다음과 같이 돌린다.

  • 오랫동안 사용되어 왔으며 구식 GUI 아이디어를 사용합니다.
  • 플롯 요소를 클릭하여 변경 (예 : 축, 제목 등) 할 수 없으며 많은 기능이 있으므로 원하는 것을 찾기가 약간 어렵습니다.

나는 또한 약간의 LLNL 인프라가 해당 저장소로 누출되는 방식을 좋아합니다. 예를 들어 docs / OfficeHours.txt 및 해당 디렉토리의 다른 파일을 참조하십시오 ! "월요일 아침 남자"브래드에게 미안 해요! 아, 그리고 자동 응답기의 비밀번호는 "Kill Ed"입니다. 잊지 마세요.

Paraview 5.4.1

웹 사이트 : https://www.paraview.org/

라이센스 : BSD

설치:

sudo apt-get install paraview

개발사 또 다른 NNSA 연구소Sandia National Laboratories에서 했으므로 데이터를 쉽게 처리 할 수있을 것으로 기대합니다. 또한 VTK 기반이며 C ++로 작성되었는데, 이는 더욱 유망했습니다.

그러나 나는 실망했다. 어떤 이유에서인지 10m 포인트로 인해 GUI가 매우 느리고 반응이 없었다.

"지금 작업 중입니다. 잠시만 기다려주십시오."라는 광고가 잘 나오면 괜찮습니다.하지만 그 동안 GUI가 멈추나요? 허용하지 않는다.

htop은 Paraview가 4 개의 스레드를 사용하고 있지만 CPU와 메모리가 모두 최대 값을 초과하지 않음을 보여주었습니다.

GUI 측면에서 Paraview는 더듬 거리지 않을 때 VisIt보다 훨씬 훌륭하고 현대적입니다. 여기에 참고 용으로 더 낮은 점수가 있습니다.

여기에 이미지 설명 입력

다음은 수동 포인트 선택이 포함 된 스프레드 시트보기입니다.

여기에 이미지 설명 입력

또 다른 단점은 Paraview가 VisIt에 비해 기능이 부족하다고 느꼈다는 것입니다. 예 :

Mayavi 4.6.2

웹 사이트 : https://github.com/enthought/mayavi

개발자 : Enthought

설치:

sudo apt-get install libvtk6-dev
python3 -m pip install -u mayavi PyQt5

VTK Python 하나.

Mayavi는 3D에 매우 중점을 두는 것처럼 보이며 2D 플롯을 수행하는 방법을 찾을 수 없었으므로 불행히도 사용 사례에 적합하지 않습니다.

그러나 성능을 확인하기 위해 https://docs.enthought.com/mayavi/mayavi/auto/example_scatter_plot.html 의 예제 를 1,000 만 포인트에 적용했으며 지연없이 잘 실행됩니다.

import numpy as np
from tvtk.api import tvtk
from mayavi.scripts import mayavi2

n = 10000000
pd = tvtk.PolyData()
pd.points = np.linspace((1,1,1),(n,n,n),n)
pd.verts = np.arange(n).reshape((-1, 1))
pd.point_data.scalars = np.arange(n)

@mayavi2.standalone
def main():
   from mayavi.sources.vtk_data_source import VTKDataSource
   from mayavi.modules.outline import Outline
   from mayavi.modules.surface import Surface
   mayavi.new_scene()
   d = VTKDataSource()
   d.data = pd
   mayavi.add_source(d)
   mayavi.add_module(Outline())
   s = Surface()
   mayavi.add_module(s)
   s.actor.property.trait_set(representation='p', point_size=1)
main()

산출:

여기에 이미지 설명 입력

그러나 개별 지점을 볼 수있을만큼 확대 할 수 없었고 가까운 3D 평면이 너무 멀었습니다. 방법이 있을까요?

Mayavi의 멋진 점 중 하나는 개발자가 Matplotlib 및 gnuplot과 마찬가지로 Python 스크립트에서 GUI를 멋지게 실행하고 설정할 수 있도록 많은 노력을 기울 였다는 것입니다. Paraview에서도 가능한 것 같지만 문서는 적어도 좋지 않습니다.

일반적으로 VisIt / Paraview만큼 기능이 충분하지 않습니다. 예를 들어 GUI에서 CSV를 직접로드 할 수 없습니다 . Mayavi GUI에서 CSV 파일을로드하는 방법은 무엇입니까?

Gnuplot 5.2.2

웹 사이트 : http://www.gnuplot.info/

gnuplot은 빠르고 더러워 질 필요가있을 때 정말 편리하며 항상 가장 먼저 시도합니다.

설치:

sudo apt-get install gnuplot

비대화 형 사용의 경우 10m 포인트를 합리적으로 잘 처리 할 수 ​​있습니다.

#!/usr/bin/env gnuplot
set terminal png size 1024,1024
set output "gnuplot.png"
set key off
set datafile separator ","
plot "10m1.csv" using 1:2:3:3 with labels point

7 초 만에 완료되었습니다.

여기에 이미지 설명 입력

하지만 상호 작용을하려고하면

#!/usr/bin/env gnuplot
set terminal wxt size 1024,1024
set key off
set datafile separator ","
plot "10m.csv" using 1:2:3 palette

과:

gnuplot -persist main.gnuplot

그러면 초기 렌더링 및 확대 / 축소가 너무 느리게 느껴집니다. 사각형 선택 선도 안보여요!

또한 내 사용 사례에서는 다음과 같이 하이퍼 텍스트 레이블을 사용해야했습니다.

plot "10m.csv" using 1:2:3 with labels hypertext

그러나 비대화 형 렌더링을 포함하여 레이블 기능에 성능 버그가있었습니다. 하지만보고했고 Ethan은 하루 만에 해결했습니다. https://groups.google.com/forum/#!topic/comp.graphics.apps.gnuplot/qpL8aJIi9ZE

그러나 이상치 선택에 대한 합리적인 해결 방법이 하나 있다고 말해야합니다. 행 ID가있는 레이블을 모든 포인트에 추가하기 만하면됩니다! 근처에 많은 포인트가 있으면 라벨을 읽을 수 없습니다. 그러나 당신이 신경 쓰는 이상치에 대해서는 그럴 수도 있습니다! 예를 들어 원래 데이터에 특이 치를 하나 추가하면 다음과 같습니다.

cp 10m.csv 10m1.csv
printf '2500000,10000000,40000000\n' >> 10m1.csv

플롯 명령을 다음과 같이 수정하십시오.

#!/usr/bin/env gnuplot
set terminal png size 1024,1024
set output "gnuplot.png"
set key off
set datafile separator ","
plot "10.csv" using 1:2:3:3 palette with labels

이로 인해 플로팅 속도가 크게 느려지지만 (위에서 언급 한 수정 후 40 분) 합리적인 출력이 생성됩니다.

여기에 이미지 설명 입력

따라서 데이터 필터링을 통해 결국 도달하게됩니다.

Matplotlib 1.5.1, numpy 1.11.1, Python 3.6.7

웹 사이트 : https://matplotlib.org/

Matplotlib는 gnuplot 스크립트가 너무 미치기 시작할 때 일반적으로 시도하는 것입니다.

numpy.loadtxt 혼자서 약 10 초가 걸렸기 때문에 이것이 잘되지 않을 것이라는 것을 알았습니다.

#!/usr/bin/env python3

import numpy
import matplotlib.pyplot as plt

x, y, z = numpy.loadtxt('10m.csv', delimiter=',', unpack=True)
plt.figure(figsize=(8, 8), dpi=128)
plt.scatter(x, y, c=z)
# Non-interactive.
#plt.savefig('matplotlib.png')
# Interactive.
plt.show()

먼저 비대화 형 시도에서 좋은 결과를 얻었지만 3 분 55 초가 걸렸습니다 ...

그런 다음 대화 형 작업은 초기 렌더링 및 확대 / 축소에 오랜 시간이 걸렸습니다. 사용할 수 없음 :

여기에 이미지 설명 입력

이 스크린 샷에서 확대 / 축소가 계산되기를 기다리는 동안 즉시 확대 / 축소되고 사라져야하는 확대 / 축소 선택이 화면에 얼마나 오랫동안 남아 있는지 확인하십시오!

plt.figure(figsize=(8, 8), dpi=128)어떤 이유로 든 인터랙티브 버전이 작동 하려면 주석을 달아야했습니다. 그렇지 않으면 다음과 같이 폭발했습니다.

RuntimeError: In set_size: Could not set the fontsize

보케 1.3.1

https://github.com/bokeh/bokeh

Ubuntu 19.04 설치 :

python3 -m pip install bokeh

그런 다음 Jupyter를 시작합니다.

jupyter notebook

이제 1m 지점을 플로팅하면 모든 것이 완벽하게 작동하고 확대 / 축소 및 호버 정보를 포함하여 인터페이스가 훌륭하고 빠릅니다.

from bokeh.io import output_notebook, show
from bokeh.models import HoverTool
from bokeh.transform import linear_cmap
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource
import numpy as np

N = 1000000
source = ColumnDataSource(data=dict(
    x=np.random.random(size=N) * N,
    y=np.random.random(size=N) * N,
    z=np.random.random(size=N)
))
hover = HoverTool(tooltips=[("z", "@z")])
p = figure()
p.add_tools(hover)
p.circle(
    'x',
    'y',
    source=source,
    color=linear_cmap('z', 'Viridis256', 0, 1.0),
    size=5
)
show(p)

초기보기 :

여기에 이미지 설명 입력

확대 후 :

여기에 이미지 설명 입력

질식하더라도 최대 10m까지 올라가면 htop크롬에 무정전 IO 상태에서 모든 메모리를 차지하는 8 개의 스레드가 있음을 보여줍니다.

포인트 참조에 대해 묻습니다. 선택한 보케 데이터 포인트를 참조하는 방법

PyViz

https://pyviz.org/

TODO 평가.

Bokeh + datashader + 기타 도구를 통합합니다.

1B 데이터 포인트 데모 비디오 : https://www.youtube.com/watch?v=k27MJJLJNT4 "PyViz :"Anaconda, Inc. "의"PyViz : 30 줄의 Python에 10 억 개의 데이터 포인트 를 시각화하기위한 대시 보드 " 게시일 : 2018-04-17.

Seaborn

https://seaborn.pydata.org/

TODO 평가.

seaborn을 사용하여 최소 5 천만 개의 행을 시각화하는 방법에 대한 QA가 이미 있습니다 .


1
놀라운 글! 샘플 코드와 함께 각 솔루션의 장단점을 자세히 설명해 주셔서 감사합니다!
gaborous

1
@gaborous 행복한 플로팅! :)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

13

보다 최근의 프로젝트는 이를 염두에두고 생성 된 Bokeh 와 같은 대용량 데이터 세트에 대한 강력한 잠재력을 가지고 있습니다 .

실제로 플롯의 규모와 관련된 데이터 만 디스플레이 백엔드로 전송됩니다. 이 접근 방식은 Matplotlib 접근 방식보다 훨씬 빠릅니다.


4
go.continuum.io/visualizing-billions-data-points를 볼 수 있습니다. 이것은 Datashader datashader.readthedocs.io (및 Bokeh!)에 관한 것입니다
scls

13

확실히 파일 읽기를 최적화 할 수 있습니다. NumPy의 원시 속도를 활용하기 위해 직접 NumPy 배열로 읽을 수 있습니다. 몇 가지 옵션이 있습니다. RAM이 문제인 경우 memmap 을 사용 하여 대부분의 파일을 RAM 대신 디스크에 보관할 수 있습니다 .

# Each data point is a sequence of three 32-bit floats:
data = np.memmap(filename, mode='r', dtype=[('index', 'float32'), ('floati','float32'), ('floatq', 'float32')])

RAM이 문제가 아니라면 fromfile을 사용 하여 전체 배열을 RAM에 넣을 수 있습니다 .

data = np.fromfile(filename, dtype=[('index', 'float32'), ('floati','float32'), ('floatq', 'float32')])

그런 다음 plot(*data)다른 솔루션에서 제안 된 "확대"방법을 통해 Matplotlib의 일반적인 기능으로 플로팅을 수행 할 수 있습니다 .


1
구조화 된 numpy 배열을 만들고 파일을 읽기 전용으로 열려면 다음을 수행하십시오 np.memmap(filename, mode='r', dtype=[('floati','f'), ('floatq', 'f')])..
jfs

백만 포인트의 두 배부터 시작하여 내가 시도한 모든 백엔드에서 Agg 오버플로가 발생하며 path.simplify = True도 사용됩니다. 그래서 나는 Matplotlib로 이것을 '그냥 그렇게'하는 것이 가능할 것이라고 믿지 않습니다.
K.-Michael Aye

흥미 롭군. Jonathan Dursi의 답변에서 언급했듯이 Matplotlib를 사용하면 2 천만 포인트를 달성 할 수 있지만 일부 제약 (래스터 출력 등)이 있습니다.
에릭 O Lebigot

8

약간 복잡한 것을 제안하지만 작동해야합니다. 다른 범위에 대해 다른 해상도로 그래프를 작성합니다.

예를 들어 Google 어스를 생각해보십시오. 전체 행성을 커버하기 위해 최대 레벨에서 확대를 해제하면 해상도가 가장 낮습니다. 확대 / 축소하면 사진이 더 자세한 사진으로 변경되지만 확대 / 축소중인 영역에서만 변경됩니다.

따라서 기본적으로 플롯에 대해 (2D? 3D? 2D라고 가정합니다) 저해상도로 전체 [0, n] 범위를 포함하는 하나의 큰 그래프를 만들고 [0, n을 포함하는 2 개의 작은 그래프를 작성하는 것이 좋습니다. / 2] 및 [n / 2 + 1, n]은 큰 해상도의 두 배, [0, n / 4] ... [3 * n / 4 + 1, n]을 두 번 포함하는 4 개의 작은 그래프 위 2의 해상도 등이 있습니다.

내 설명이 정말 명확하지 않습니다. 또한 이러한 종류의 다중 해상도 그래프가 기존 플롯 프로그램에서 처리되는지 여부도 모릅니다.


이 경우 샘플 속도를 간단히 줄일 수 있지만 하나의 대화 형 플롯에 많은 값이 필요합니다.
wishi

4
@wishi : 하나의 플롯 에 수백만 개의 가치 가 필요 합니까? 나에게는 적응 형 해상도가 합리적으로 보입니다.
user703016 2011 년

기회가 없습니다. 특히 매우 짧은 신호 버스트로 캡슐화 된 실시간 데이터를 기록하고 있습니다. 이는 모든 샘플 또는 아무것도 의미하지 않습니다. 분석 할 계획에 적응할 수 없습니다.)
wishi

12
데이터 분석이 아니라 디스플레이 문제 일뿐입니다. 결과는 영향을받지 않고 디스플레이 만 영향을받습니다.
user703016 2011 년

비슷한 문제가 있지만 몇 년 동안 테라 바이트의 데이터가 있습니다. (샘플링 속도가 40kHz 인 센서 데이터). 이제 x 시간 또는 하루 종일 평균 값과 같은 것을 그리는 대화식 플롯을 만들고 싶습니다. 확대하면 새로운 평균 값을 동적으로 계산해야합니다. 평균 계산이 필요하지 않다는 점에서. 질문입니다 :이 이미 실현과 같은 뭔가 또는 나 자신에 의해 그것을 프로그램이
white91wolf

2

포인트 조회 속도를 높여 승리 할 수 ​​있는지 궁금합니다. (나는 한동안 R * (r star) 나무에 흥미를 느꼈다.)

이 경우 r * 트리와 같은 것을 사용하는 것이 방법이 될 수 있는지 궁금합니다. (축소 할 때 트리의 상위 노드에는 더 거칠고 축소 된 렌더링에 대한 정보가 포함될 수 있으며 잎쪽으로 더 멀리있는 노드에는 개별 샘플이 포함됩니다.)

성능을 유지하고 RAM 사용량을 낮게 유지하기 위해 메모리 트리 (또는 사용하게되는 구조)를 메모리에 매핑 할 수도 있습니다. (메모리 관리 작업을 커널로 오프로드합니다)

이해가 되길 바랍니다 .. 늦었 어!


R에 대해 전혀 모르겠습니다. 내 데이터 세트는 {index, floati, floatq}와 같은 csv와 비슷합니다. 2 천만 번 반복됩니다. R에서 언급 한 데이터 구조를 어떻게 구축했는지 잘 모르겠습니다.
wishi

3
관련된 프로젝트라고 생각합니다. 나는 "R 별"나무에 대해 이야기하고있다. wikipedia : en.wikipedia.org/wiki/R * _tree HTH
nielsbot 2011 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.