source

Python's Pandas의 데이터 프레임에서 Matplotlib 산점도 만들기

manycodes 2023. 10. 28. 08:04
반응형

Python's Pandas의 데이터 프레임에서 Matplotlib 산점도 만들기

다음을 사용하여 일련의 산점도를 만드는 가장 좋은 방법은 무엇입니까?matplotlib로부터pandas파이썬의 데이터 프레임?

예를 들어, 데이터 프레임이 있는 경우df관심있는 칼럼들이 있는데, 저는 일반적으로 모든 것을 어레이로 변환하고 있다는 것을 발견했습니다.

import matplotlib.pylab as plt
# df is a DataFrame: fetch col1 and col2 
# and drop na rows if any of the columns are NA
mydata = df[["col1", "col2"]].dropna(how="any")
# Now plot with matplotlib
vals = mydata.values
plt.scatter(vals[:, 0], vals[:, 1])

플롯하기 전에 모든 것을 배열로 변환할 때의 문제점은 데이터 프레임에서 벗어나도록 강요한다는 것입니다.

전체 데이터 프레임을 갖는 것이 플롯에 필수적인 다음 두 가지 활용 사례를 생각해 보십시오.

  1. 예를 들어, 만약 당신이 지금 모든 값을 보고 싶다면 어떻게 하겠습니까?col3통화에서 표시한 해당 값에 대해scatter, 그리고 각 점(또는 크기)을 그 값으로 색칠합니까?돌아가서 비나 값을 뽑아내야 할 겁니다col1,col2해당 값이 무엇인지 확인합니다.

    데이터 프레임을 보존하면서 플롯하는 방법이 있습니까?예를 들어,

    mydata = df.dropna(how="any", subset=["col1", "col2"])
    # plot a scatter of col1 by col2, with sizes according to col3
    scatter(mydata(["col1", "col2"]), s=mydata["col3"])
    
  2. 마찬가지로, 일부 열의 값에 따라 각 점을 필터링하거나 색을 다르게 칠하려고 한다고 가정합니다.예를 들어, 특정 컷오프를 충족하는 점의 레이블을 자동으로 표시하려는 경우col1, col2(라벨이 df의 다른 열에 저장되어 있는) 이들과 나란히 있거나, 사람들이 R의 데이터 프레임을 사용하는 것처럼 이 점들을 다르게 색칠합니다.예를 들어,

    mydata = df.dropna(how="any", subset=["col1", "col2"]) 
    myscatter = scatter(mydata[["col1", "col2"]], s=1)
    # Plot in red, with smaller size, all the points that 
    # have a col2 value greater than 0.5
    myscatter.replot(mydata["col2"] > 0.5, color="red", s=0.5)
    

이것이 어떻게 행해지는가?

승무원 앨범에 대한 답변 편집:

각 조건을 그림으로 표시하는 것이 가장 좋은 방법이라고 합니다(예:subset_a,subset_b)을(를) 개별로.산점을 4종류 이상의 점으로 분할하여 각각 다른 모양/색상으로 표시하는 등 여러 조건이 있는 경우에는 어떻게 해야 합니다.어떻게 조건 a, b, c 등을 우아하게 적용하고 마지막 단계로 "나머지"(이 조건들 중 어떤 것에도 없는 것들)를 플롯할 수 있습니까?

그림을 그리는 예제에서도 마찬가지로col1,col2기준을 달리하여col3, 만약 NA 값들이 사이의 연관성을 깨는 것이 있다면 어떻게 할 것인가요?col1,col2,col3? 예를 들어, 모두 표시하려는 경우col2그 가치관에 근거한 가치관col3값들, 그러나 일부 행들은 둘 중 하나에 NA 값을 갖습니다.col1아니면col3, 강제로 사용하기dropna처음엔 그렇게 했었겠죠

mydata = df.dropna(how="any", subset=["col1", "col2", "col3")

다음을 사용하여 플롯을 구성할 수 있습니다.mydata보여주는 것처럼 -- 사이의 산점도를 표시합니다.col1,col2값을 사용하여col3.그렇지만mydata값이 있는 일부 점이 누락됩니다.col1,col2 NA는만 NA에 합니다.col3, 아직도 계획이 짜여져 있어야 합니다그렇다면 기본적으로 데이터의 "나머지", 즉 필터링된 집합에 없는 점을 어떻게 플롯하시겠습니까?mydata?

열 전달 시도DataFramenumpy 배열로 추출하는 대신 아래 예제와 같이 직접 matplotlib에 적용합니다.

df = pd.DataFrame(np.random.randn(10,2), columns=['col1','col2'])
df['col3'] = np.arange(len(df))**2 * 100 + 100

In [5]: df
Out[5]: 
       col1      col2  col3
0 -1.000075 -0.759910   100
1  0.510382  0.972615   200
2  1.872067 -0.731010   500
3  0.131612  1.075142  1000
4  1.497820  0.237024  1700

다른 열을 기준으로 산점 점 크기 변경

plt.scatter(df.col1, df.col2, s=df.col3)
# OR (with pandas 0.13 and up)
df.plot(kind='scatter', x='col1', y='col2', s=df.col3)

enter image description here

다른 열을 기준으로 산점 색상 변경

colors = np.where(df.col3 > 300, 'r', 'k')
plt.scatter(df.col1, df.col2, s=120, c=colors)
# OR (with pandas 0.13 and up)
df.plot(kind='scatter', x='col1', y='col2', s=120, c=colors)

enter image description here

범례가 있는 산점도

하지만 전설을 가지고 산점도를 만드는 가장 쉬운 방법은plt.scatter각 포인트 유형별로 한 번씩.

cond = df.col3 > 300
subset_a = df[cond].dropna()
subset_b = df[~cond].dropna()
plt.scatter(subset_a.col1, subset_a.col2, s=120, c='b', label='col3 > 300')
plt.scatter(subset_b.col1, subset_b.col2, s=60, c='r', label='col3 <= 300') 
plt.legend()

enter image description here

갱신하다

제가 알기로는 매트플롯리브는 NA x/y 좌표 또는 NA 스타일 설정(예: 색상/크기)으로 포인트를 건너뛸 수 있습니다.NA로 인해 건너뛴 점을 찾으려면isnull법:df[df.col3.isnull()]

점 목록을 여러 유형으로 분할하려면 벡터화된 if-then-else 구현이며 선택적인 기본값을 사용하는 numpy를 살펴봅니다.예를 들어,

df['subset'] = np.select([df.col3 < 150, df.col3 < 400, df.col3 < 600],
                         [0, 1, 2], -1)
for color, label in zip('bgrm', [0, 1, 2, -1]):
    subset = df[df.subset == label]
    plt.scatter(subset.col1, subset.col2, s=120, c=color, label=str(label))
plt.legend()

enter image description here

가렛의 훌륭한 대답에 추가될 것이 거의 없지만, 팬더에게도 방법이 있습니다.그것을 사용하면, 그것은 아주 쉽습니다.

df = pd.DataFrame(np.random.randn(10,2), columns=['col1','col2'])
df['col3'] = np.arange(len(df))**2 * 100 + 100
df.plot.scatter('col1', 'col2', df['col3'])

plotting sizes in col3 to col1-col2

다른 방법을 사용하는 것을 추천합니다.seaborn데이터 플롯을 위한 더 강력한 도구입니다.사용가능seaborn scatterplot3열을 다음과 같이 정의합니다.hue그리고.size.

작업 코드:

import pandas as pd
import seaborn as sns
import numpy as np

#creating sample data 
sample_data={'col_name_1':np.random.rand(20),
      'col_name_2': np.random.rand(20),'col_name_3': np.arange(20)*100}
df= pd.DataFrame(sample_data)
sns.scatterplot(x="col_name_1", y="col_name_2", data=df, hue="col_name_3",size="col_name_3")

enter image description here

언급URL : https://stackoverflow.com/questions/14300137/making-matplotlib-scatter-plots-from-dataframes-in-pythons-pandas

반응형