포트폴리오

R, python 누적 막대 차트 (VADeaths 데이터 이용)

leegunho 2022. 6. 28. 10:20

VADeaths.csv
0.00MB

R 코드

 

#- VADeaths.csv 이용
#- "Rural Male","Rural Female","Urban Male","Urban Female" 별로 나이대 사망률 누적그래프
install.packages("reshape")
library(reshape)
library(lobstr)
library(ggplot2)
data("VADeaths")
#df 에 VADeaths 데이터를 데이터 프레임 형태로 넣어줍니다. + 데이터 확인
VADeaths_df <- as.data.frame(VADeaths)
str(VADeaths_df)
View(VADeaths_df)
#데이터 프레임 생성 
#나이대 를 확인하니 50-54, 55-59, 60-64,65-69, 70-74 가 행이름으로 표시 되어있습니다.
#나이별로 데이터를 출력하기 위해 age 열을 생성해주겠습니다.
age <- c('70-74','65-69','60-64','55-59','50-54')
VADeaths_df <- cbind(VADeaths_df,age)
VADeaths_df

#함수는  데이터를 재구성하는 함수
#age를 기준으로 데이터를 분리. measure.var 에는 표시하고 싶은 열들을 추가 
VAD_melt <- melt(VADeaths_df,
                 id.vars = 'age',
                 measure.var = c('Rural Male', 'Rural Female', 'Urban Male', 'Urban Female'))
VAD_melt

#열 이름을 변경해줍니다.  variable <- location, value <- deaths
names(VAD_melt) <- c('age', 'location', 'deaths')
VAD_melt

# theme() - panel의 디자인 변경
ggplot(VAD_melt, aes(x =location, y = deaths, fill = age)) + 
  geom_bar(stat = 'identity', position = 'stack') + 
  theme(plot.title = element_text(hjust = 0.5))

R 결과

python 과 동일하지 않습니다.(나이 순서)


python 코드

'''
VADeaths.csv 이용
"Rural Male","Rural Female","Urban Male","Urban Female" 별로 나이대 사망률 누적그래프
'''

dataframe = pd.read_csv('dataset/VADeaths.csv')  # pandas의 csv파일을 읽어서 dataframe 형태로 만들어주는 read_csv함수를 이용해서 csv 파일을 읽음
x = dataframe.columns.tolist()[1:]  # dataframe에서 column의 columns 함수로 타이틀들을 가져온후 tolist 함수로 이를 리스트로 만들어줌
                                           # 리스트를 [1:]로 슬라이싱해서 0번째 값은 제외한 나머지 리스트를 x데이터로 사용하도록 함
                                           # VAdeaths.csv의 columns는 "","Rural Male","Rural Female","Urban Male","Urban Female" 인데,
                                           # 맨 앞의 ""을 제외하고"Rural Male","Rural Female","Urban Male","Urban Female" 을 x축으로 사용하기 위해 이와같이 처리

labels = []  # 막대그래프 label을 담을 리스트
datas = []  # 막대그래프의 데이터를 누적해서 담을 리스트

for data in dataframe.values:  # 데이터프레임에서 행단위로 값을 가져와서 하나하나 순회
    labels.append(data[0])  # 첫번째열은 "50-54" 와 같은 나이대 구분자이므로 label로 지정해 범례로 쓰기 위해 label 리스트에 넣음
    datas.append(data[1:])  # 두번째열부터 마지막열은 실제 사망률 데이터이므로 이는 datas에 넣음

for i in range(len(datas)):  # datas 개수만큼 반복 (이 데이터들을 누적해서 쌓을 예정)
    if i == 0:  # 첫번째 데이터는
        plt.bar(x, datas[i], label=labels[i])  # 누적할 곳이 없으므로 bar 함수를 이용해서 막대그래프를 그림 (x축 데이터는 변수x, y축 데이터는 dats[i]로 지정. 범례가 될 label은 lables[i]로 지정)
    else:  # 첫번째 이후 데이터는 (누적해서 쌓기 위해 bottom이라는 옵션값이 추가로 들어감)
        plt.bar(x, datas[i], label=labels[i], bottom=sum(datas[0:i]))  # 위와 동일하게 bar함수를 이용해서 막대그래프를 그리는데, bottom 옵션을 이용해서 아래에 데이터를 쌓아서 그림
                                                                       # i번쨰 그래프는 datas[0]~datas[i-1]까지의 sum을 쌓아서 막대그래가 누적되도도록 함

plt.legend()  # 그래프에 범례를 표시하기 위해 legend 함수 호출
plt.savefig('ex2.png')  # 그래프를 그려서 ex2.png 라는 이름의 파일에 저장하도록 함

python 결과

python 에서 나이대를 R처럼. 해야하는데 하는방법은  조금더 공부해서 수정.