Python matplotlib 에서 excel 데 이 터 를 읽 고 여러 개의 하위 그림 을 반복 적 으로 그립 니 다 subplot 작업

엑셀 데 이 터 를 읽 으 려 면 xlrd 모듈 을 사용 하여 명령 행 에서 아래 명령 을 실행 하여 설치 해 야 합 니 다.
pip install xlrd
표 의 내용 은 대체적으로 다음 과 같다.몇 개의 sheet 이 있 는데 매 sheet 는 같은 학교의 모든 학생 성적 을 기 록 했 고 국어,수학,영어,종합,총 점 으로 나 뉜 다.
시험 번호
성명.
학급
학교.
국어
수학.
영어.
종합 하 다
총 점
...
...
...
...
136
136
100
57
429
...
...
...
...
128
106
70
54
358
...
...
...
...
110.5
62
92
44
308.5
여러 장의 서브 맵 을 그 리 려 면 subplot 함수 가 필요 합 니 다.
subplot(nrows, ncols, index, **kwargs)
캔버스 에 다음 과 같은 형식 으로 여러 장의 자 도 를 그 리 려 고 합 니 다.
국어 수학
영어---종합
총 점
사용 할 subplot 인 자 는 각각
subplot(321) --- subplot(322)
subplot(323) --- subplot(324)
subplot(313)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from xlrd import open_workbook as owb
import matplotlib.pyplot as plt
#import matplotlib.colors as colors
#from matplotlib.ticker import MultipleLocator, FormatStrFormatter, FuncFormatter
import numpy as np
 
districts=[] #       --   excel   sheet 
data_index = 0
new_colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728',
    '#9467bd', '#8c564b', '#e377c2', '#7f7f7f',
    '#bcbd22', '#17becf']
wb = owb('raw_data.xlsx') #     
active_districts = ['  ','  ','  '] ##           ,          
avg_yuwen = []
avg_shuxue = []
avg_yingyu = []
avg_zonghe = []
avg_total = []
'             Y   '
for s in wb.sheets():
 #              ,        
 #if s.name not in active_districts:
  # continue
 print('Sheet: ', s.name)
 districts.append(s.name)
 avg_score = 0
 yuwen = 0
 shuxue = 0
 yingyu = 0
 zonghe = 0
 zongfen = 0
 total_student = 0
 for row in range(1,s.nrows):
  total_student += 1
  #            
  yuwen = yuwen + (s.cell(row, 4).value - yuwen)/total_student #   
  shuxue = shuxue + (s.cell(row, 5).value - shuxue) / total_student #   
  yingyu = yingyu + (s.cell(row, 6).value - yingyu) / total_student #   
  zonghe = zonghe + (s.cell(row, 7).value - zonghe) / total_student #   
  zongfen = zongfen + (s.cell(row, 8).value - zongfen) / total_student #   
 avg_yuwen.append(yuwen)
 avg_shuxue.append(shuxue)
 avg_yingyu.append(yingyu)
 avg_zonghe.append(zonghe)
 avg_total.append(zongfen)
 data_index += 1
 
print('    ...')
plt.rcParams['font.sans-serif']=['SimHei'] #     
plt.rcParams['axes.unicode_minus']=False #     
figsize = 11,14
fig = plt.figure(figsize=figsize)
fig.suptitle('           ',fontsize=18)
my_x=np.arange(len(districts))
width=0.5
 
ax1 = plt.subplot(321)
#total_width=width*(len(districts))
b = ax1.bar(my_x , avg_yuwen, width, tick_label=districts, align='center', color=new_colors)
for i in range(0,len(avg_yuwen)):
 ax1.text(my_x[i], avg_yuwen[i], '%.2f' % (avg_yuwen[i]), ha='center', va='bottom',fontsize=10)
ax1.set_title(u'  ')
ax1.set_ylabel(u"   ")
ax1.set_ylim(60, 130)
 
ax2 = plt.subplot(322)
ax2.bar(my_x, avg_shuxue, width, tick_label=districts, align='center', color=new_colors)
for i in range(0, len(avg_shuxue)):
 ax2.text(my_x[i], avg_shuxue[i], '%.2f' %(avg_shuxue[i]), ha='center', va='bottom', fontsize=10)
ax2.set_title(u'  ')
ax2.set_ylabel(u'   ')
ax2.set_ylim(50,120)
 
ax3 = plt.subplot(323)
b = ax3.bar(my_x , avg_yingyu, width, tick_label=districts, align='center', color=new_colors)
for i in range(0,len(avg_yingyu)):
 ax3.text(my_x[i], avg_yingyu[i], '%.2f' % (avg_yingyu[i]), ha='center', va='bottom',fontsize=10)
ax3.set_title(u'  ')
ax3.set_ylabel(u"   ")
ax3.set_ylim(30, 100)
 
ax4 = plt.subplot(324)
b = ax4.bar(my_x , avg_zonghe, width, tick_label=districts, align='center', color=new_colors)
for i in range(0,len(avg_zonghe)):
 ax4.text(my_x[i], avg_zonghe[i], '%.2f' % (avg_zonghe[i]), ha='center', va='bottom',fontsize=10)
ax4.set_title(u'  ')
ax4.set_ylabel(u"   ")
ax4.set_ylim(0, 60)
 
ax5 = plt.subplot(313)
total_width=width*(len(districts))
b = ax5.bar(my_x , avg_total, width, tick_label=districts, align='center', color=new_colors)
for i in range(0,len(avg_total)):
 ax5.text(my_x[i], avg_total[i], '%.2f' % (avg_total[i]), ha='center', va='bottom',fontsize=10)
ax5.set_title(u'  ')
ax5.set_ylabel(u"   ")
ax5.set_ylim(250, 400)
 
plt.savefig('avg.png')
plt.show()

이렇게 하면 그 릴 수 있 지만 모든 subplot 의 코드 를 수 동 으로 써 야 합 니 다.코드 중 복 량 이 너무 많 으 니 for 순환 방식 을 사용 할 수 있 습 니까?
계속 시도 해 보 세 요.
for 순환 에 필요 한 매개 변 수 를 먼저 정리 합 니 다.

avg_scores = [] #       ,2 list
subjects = ['  ','  ','  ','  ','  '] #     title
plot_pos = [321,322,323,324,313] #        
y_lims = [(60,130), (50,120), (30,100), (0,60), (200,400)] #      ylim  
데이터 읽 기 수정 은 간단 하지만 그림 을 그 릴 때 ax=plt.subplots(pltpos[pos]방법 은 틀 릴 수 있 습 니 다.

Traceback (most recent call last):
 File "...xxx.py", line 66, in <module>
 b = ax.bar(my_x , y_data, width, tick_label=districts, align='center', color=new_colors) #     
AttributeError: 'tuple' object has no attribute 'bar'
검색 해 보 니 마땅 한 답 을 찾 지 못 했 습 니 다.fig.add 로 바 꿀 수 있 을 거 라 고 생각 했 습 니 다.subplot(plot_pos[pos])시험 해 보 니 성공 적 이 었 습 니 다.전체 코드 는 다음 과 같 습 니 다.

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from xlrd import open_workbook as owb
import matplotlib.pyplot as plt
#import matplotlib.colors as colors
#from matplotlib.ticker import MultipleLocator, FormatStrFormatter, FuncFormatter
import numpy as np
 
districts=[] #       --   excel   sheet 
total_stu=[] #         
data_index = 0
new_colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728',
    '#9467bd', '#8c564b', '#e377c2', '#7f7f7f',
    '#bcbd22', '#17becf']
wb = owb('raw_data.xlsx') #     
active_districts = ['BY','  ','  ','WR','  '] ##           ,          
avg_scores = [] #       ,2 list
subjects = ['  ','  ','  ','  ','  '] #     title
plot_pos = [321,322,323,324,313] #        
y_lims = [(60,130), (50,120), (30,100), (0,60), (200,400)] #      ylim  
 
'             Y   '
for s in wb.sheets():
 #              ,        
 #if s.name not in active_districts:
  # continue
 print('Sheet: ', s.name)
 districts.append(s.name)
 avg_scores.append([])
 yuwen = 0
 shuxue = 0
 yingyu = 0
 zonghe = 0
 zongfen = 0
 total_student = 0
 for row in range(1,s.nrows):
  total_student += 1
  #tmp = s.cell(row,4).value
  yuwen = yuwen + (s.cell(row, 4).value - yuwen)/total_student #   
  shuxue = shuxue + (s.cell(row, 5).value - shuxue) / total_student #   
  yingyu = yingyu + (s.cell(row, 6).value - yingyu) / total_student #   
  zonghe = zonghe + (s.cell(row, 7).value - zonghe) / total_student #   
  zongfen = zongfen + (s.cell(row, 8).value - zongfen) / total_student #   
 avg_scores[data_index].append(yuwen)
 avg_scores[data_index].append(shuxue)
 avg_scores[data_index].append(yingyu)
 avg_scores[data_index].append(zonghe)
 avg_scores[data_index].append(zongfen)
 data_index += 1
 
print('    ...')
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
figsize = 11,14
fig = plt.figure(figsize=figsize)
fig.suptitle('           ',fontsize=18)
my_x=np.arange(len(districts))
width=0.5
 
print(avg_scores)
for pos in np.arange(len(plot_pos)):
 #ax = plt.subplots(plot_pos[pos])
 ax = fig.add_subplot(plot_pos[pos]) #    ax = plt.subplots   'tuple' object has no attribute 'bar'
 y_data = [x[pos] for x in avg_scores] #      
 print(y_data)
 b = ax.bar(my_x , y_data, width, tick_label=districts, align='center', color=new_colors) #     
 for i in np.arange(len(y_data)):
  ax.text(my_x[i], y_data[i], '%.2f' % (y_data[i]), ha='center', va='bottom',fontsize=10) #     
 ax.set_title(subjects[pos])
 ax.set_ylabel(u"   ")
 ax.set_ylim(y_lims[pos])
 
plt.savefig('jh_avg_auto.png')
plt.show()
이전의 결과 와 마찬가지 로 유일한 미세한 차 이 를 찾 을 수 있 잖 아 요.

이 Python matplotlib 는 엑셀 데 이 터 를 읽 고 for 순환 으로 여러 개의 키 그림 을 그립 니 다.subplot 작업 은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 시 기 를 바 랍 니 다.많은 응원 바 랍 니 다.

좋은 웹페이지 즐겨찾기