<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>파트 &#8211; 투데이즈.kr</title>
	<atom:link href="https://2days.kr/tag/%ed%8c%8c%ed%8a%b8/feed/" rel="self" type="application/rss+xml" />
	<link>https://2days.kr</link>
	<description>투데이즈</description>
	<lastBuildDate>Sun, 16 Nov 2025 13:13:21 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8</generator>

<image>
	<url>https://2days.kr/wp-content/uploads/2025/10/cropped-simbol-1-32x32.png</url>
	<title>파트 &#8211; 투데이즈.kr</title>
	<link>https://2days.kr</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>파이썬 차트 스타일 적용하기 차트 그리기</title>
		<link>https://2days.kr/08/11/18/8064/it/program/</link>
		
		<dc:creator><![CDATA[urjent]]></dc:creator>
		<pubDate>Wed, 08 Nov 2023 09:46:36 +0000</pubDate>
				<category><![CDATA[program]]></category>
		<category><![CDATA[차트 그리기]]></category>
		<category><![CDATA[파이썬]]></category>
		<category><![CDATA[파이썬 차트]]></category>
		<category><![CDATA[파이썬 차트 그리기]]></category>
		<category><![CDATA[파이썬 차트 스타일]]></category>
		<category><![CDATA[파트]]></category>
		<guid isPermaLink="false">https://2days.kr/?p=8064</guid>

					<description><![CDATA[본 포스팅에서는 파이썬 차트 스타일 적용하는 방법에 대해서 알아 보려고 합니다. Python-pptx 패키지를 활용하여 차트를 그리고 스타일을 적용하는 방법에 대해 소개를 하려고 하는데요, python으로 차트를 그리는 방법을 다루는 블로그들은 많지만 디자인 변경까지 알려주는 튜토리얼은 찾기 힘들었던 기억이 있는데요, 차트를 좀더 예쁘게 그려보고 싶은 분들께 오늘 글이 도움이 되었으면 좋겠습니다.]]></description>
										<content:encoded><![CDATA[<p style="color: #666666; text-align: start;" data-ke-size="size16">본 포스팅에서는 파이썬 차트 스타일 적용하는 방법에 대해서 알아 보려고 합니다. Python-pptx 패키지를 활용하여 차트를 그리고 스타일을 적용하는 방법에 대해 소개를 하려고 하는데요, python으로 차트를 그리는 방법을 다루는 블로그들은 많지만 디자인 변경까지 알려주는 튜토리얼은 찾기 힘들었던 기억이 있는데요, 차트를 좀더 예쁘게 그려보고 싶은 분들께 오늘 글이 도움이 되었으면 좋겠습니다.</p>
<p style="color: #666666; text-align: start;" data-ke-size="size16">
<p style="color: #666666; text-align: start;" data-ke-size="size16">
<figure data-ke-type="image" data-ke-mobilestyle="widthOrigin" data-ke-style="alignCenter"><img post-id="8064" fifu-featured="1" decoding="async" src="https://blog.kakaocdn.net/dn/bjSkTL/btszZkwzdA3/EWCOisRJK3TSVWOpVYOSQk/img.jpg" alt="파이썬 차트 스타일 적용하기 차트 그리기" title="파이썬 차트 스타일 적용하기 차트 그리기" data-is-animation="false" data-origin-width="2560" data-origin-height="2560" data-filename="제목을 입력해주세요_-001 (3).jpg" title="파이썬 차트 스타일 적용하기 차트 그리기 1"><figcaption>파이썬 차트 스타일 적용하기 차트 그리기</figcaption></figure><div class='code-block code-block-2' style='margin: 8px auto; text-align: center; display: block; clear: both;'>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8940400388075870"
     crossorigin="anonymous"></script>
<!-- 중간 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8940400388075870"
     data-ad-slot="8794586137"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div>

<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/bnbMrA/btszXo0SeU4/xF9VrswJkFe8arFD0Ul460/img.png" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvEbgm%2Fbtsu0qhBCxt%2FQDConmajedD6bCmHQRgBlK%2Fimg.png" data-origin-height="137" data-origin-width="377" data-is-animation="false" alt="img" title="파이썬 차트 스타일 적용하기 차트 그리기 2"></figure>
<p style="color: #666666; text-align: start;" data-ke-size="size16">
<p style="color: #666666; text-align: start;" data-ke-size="size16">
<h3 style="color: #666666; text-align: start;" data-ke-size="size23"><b>파이썬 차트 스타일 적용하기 차트 그리기</b></h3>
<hr contenteditable="false" data-ke-type="horizontalRule" data-ke-style="style5" />
<p style="color: #666666; text-align: start;" data-ke-size="size16">
<p style="color: #666666; text-align: start;" data-ke-size="size16">
<p style="color: #666666; text-align: start;" data-ke-size="size16">준비물 리스트</p>
<p style="color: #666666; text-align: start;" data-ke-size="size16">위 글에서는 차트를 ppt에서 그리지 않고 그림 파일로 만들어져 있는 차트(charts 폴더에 있는 이미지들)를 삽입하는 방법을 소개했는데, 이번에는 좀더 심화된 버전으로 ppt 차트를 직접 그리는 방법을 다루어보겠습니다.</p>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img fetchpriority="high" decoding="async" src="https://blog.kakaocdn.net/dn/cHYF8a/btszZFAweZX/NhLMJlgNRtraT64na1qj6K/img.png" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjCLVY%2FbtsuZ0KmKxe%2FKf5e8qkhCg7sIm9Re3kdC0%2Fimg.png" width="860" height="399" data-origin-height="593" data-origin-width="1280" data-is-animation="false" alt="img" title="파이썬 차트 스타일 적용하기 차트 그리기 3"><figcaption>파이썬 차트 스타일 적용하기 차트 그리기</figcaption></figure>
<p style="color: #666666; text-align: start;" data-ke-size="size16">결과물(우측상단 차트) 예시</p>
<p style="color: #666666; text-align: start;" data-ke-size="size16">먼저 Apple의 연도별 브랜드가치를 담은 차트를 먼저 만들어본 후 지난 포스트에서 처럼 100대 브랜드에 대한 슬라이드를 모두 만들어보겠습니다.</p>
<p style="color: #666666; text-align: start;" data-ke-size="size16"><span style="color: #666666; text-align: start;">[Apple의 연도별 브랜드가치]</span></p>
<table style="color: #666666; text-align: start; border-collapse: collapse; width: 100%; height: 34px;" border="1" data-ke-align="alignLeft">
<tbody>
<tr>
<td>2018</td>
<td>2019</td>
<td>2020</td>
<td>2021</td>
<td>2022</td>
</tr>
<tr>
<td>$ 214,480M</td>
<td>$ 234,241M</td>
<td>$ 322,999M</td>
<td>$ 408,251M</td>
<td>$ 482,215M</td>
</tr>
</tbody>
</table>
<p style="color: #666666; text-align: start;" data-ke-size="size16">가장 기본적인 형태의 line chart를 그리는 방법은 다음과 같습니다.</p>
<pre id="code_1699432147442" class="hljs nix" style="color: #000000; text-align: start;" contenteditable="false" data-ke-type="codeblock" data-ke-language="python">from pptx <span class="hljs-built_in">import</span> Presentation
from pptx.chart.data <span class="hljs-built_in">import</span> ChartData
from pptx.enum.chart <span class="hljs-built_in">import</span> XL_CHART_TYPE
from pptx.util <span class="hljs-built_in">import</span> Cm

<span class="hljs-attr">prs</span> = Presentation()
<span class="hljs-comment"># 레이아웃 이름이 한글로 '빈 화면'으로 설정되어있는 경우는 'Blank' 대신 '빈 화면'으로 작성하면 됩니다.</span>
<span class="hljs-attr">blank_slide_layout</span> = prs.slide_layouts.get_by_name('Blank')
<span class="hljs-attr">slide</span> = prs.slides.add_slide(blank_slide_layout)

<span class="hljs-attr">brand</span> = 'Apple'
<span class="hljs-attr">values_by_year</span> = [<span class="hljs-number">214480</span>, <span class="hljs-number">234241</span>,<span class="hljs-number">322999</span>,<span class="hljs-number">408251</span>,<span class="hljs-number">482215</span>]

<span class="hljs-attr">chart_data</span> = ChartData()
<span class="hljs-comment"># x축 데이터입니다.</span>
chart_data.<span class="hljs-attr">categories</span> = [x for x <span class="hljs-keyword">in</span> range(<span class="hljs-number">2018</span>,<span class="hljs-number">2023</span>)]

<span class="hljs-comment"># y축 데이터입니다.</span>
chart_data.add_series(brand,  values_by_year)  

<span class="hljs-attr">chart</span> = slide.shapes.add_chart(XL_CHART_TYPE.LINE,
                               <span class="hljs-attr">x</span> = Cm(<span class="hljs-number">2</span>), <span class="hljs-comment"># 좌상단기준 가로 위치</span>
                               <span class="hljs-attr">y</span> = Cm(<span class="hljs-number">1</span>), <span class="hljs-comment"># 좌상단기준 세로 위치</span>
                               <span class="hljs-attr">cx</span> = Cm(<span class="hljs-number">21</span>), <span class="hljs-comment"># 넓이</span>
                               <span class="hljs-attr">cy</span> = Cm(<span class="hljs-number">17</span>), <span class="hljs-comment"># 높이</span>
                               <span class="hljs-attr">chart_data</span> = chart_data).chart

prs.save('test.pptx')</pre>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/B9sF4/btszVtg4rvJ/gFNzbGukcbQDSWXcCZz8ak/img.png" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcU7kuF%2Fbtsu9NXrd9T%2FlO3OvjzH3J3MHPSPOK4hWK%2Fimg.png" width="700" height="524" data-origin-height="737" data-origin-width="984" data-is-animation="false" alt="img" title="파이썬 차트 스타일 적용하기 차트 그리기 4"></figure>
<p style="color: #666666; text-align: start;" data-ke-size="size16">큼직하게 그려봤는데요, 맨위의 예시처럼 하나하나 바꿔보겠습니다.</p>
<p style="color: #666666; text-align: start;" data-ke-size="size16">먼저 타이틀과 범례를 지웁니다.</p>
<pre id="code_1699432147448" class="hljs ini" style="color: #000000; text-align: start;" contenteditable="false" data-ke-type="codeblock" data-ke-language="python"><span class="hljs-attr">chart.has_title</span> = <span class="hljs-literal">False</span>
<span class="hljs-attr">chart.has_legend</span> = <span class="hljs-literal">False</span></pre>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/kIPQ6/btszVsboI3B/lGepAc7XSDqMSb0ESqKS5k/img.png" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq2PCF%2Fbtsu8l7Y899%2F93FU6GU3uXYe1vZsAET620%2Fimg.png" width="700" height="522" data-origin-height="735" data-origin-width="986" data-is-animation="false" alt="img" title="파이썬 차트 스타일 적용하기 차트 그리기 5"></figure>
<p style="color: #666666; text-align: start;" data-ke-size="size16">Y축(value_axis)에 삐죽 튀어나온 틱마크를 지워줍니다.</p>
<pre id="code_1699432147449" class="hljs crystal" style="color: #000000; text-align: start;" contenteditable="false" data-ke-type="codeblock" data-ke-language="python">from pptx<span class="hljs-class">.<span class="hljs-keyword">enum</span>.<span class="hljs-title">chart</span> <span class="hljs-title">import</span> <span class="hljs-title">XL_TICK_MARK</span></span>

value_axis = chart.value_axis
value_axis.major_tick_mark = XL_TICK_MARK.NONE

<span class="hljs-comment"># 틱마크는 CROSS, INSIDE, NONE, OUTSIDE 네가지 중 선택할 수 있습니다.</span></pre>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img loading="lazy" decoding="async" src="https://blog.kakaocdn.net/dn/qxxfB/btszZkJ1fT3/Col7DNvumqB9SCYvEThnA0/img.png" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYpVc5%2FbtsuZQ1VDLh%2F9fk97SAGkChC0qYKVL0J81%2Fimg.png" width="700" height="523" data-origin-height="740" data-origin-width="990" data-is-animation="false" alt="img" title="파이썬 차트 스타일 적용하기 차트 그리기 6"></figure>
<p style="color: #666666; text-align: start;" data-ke-size="size16">가로 세로축 레이블의 폰트, 사이즈, 서식 등을 바꾸어줍니다.</p>
<pre id="code_1699432147451" class="hljs nix" style="color: #000000; text-align: start;" contenteditable="false" data-ke-type="codeblock" data-ke-language="python">from pptx.util <span class="hljs-built_in">import</span> Pt

<span class="hljs-comment"># value_axis : 브랜드 가치 값이 들어있는 y축</span>
value_axis.tick_labels.font.<span class="hljs-attr">name</span> = '맑은 고딕' <span class="hljs-comment">#시스템에 설치된 폰트명을 그대로 입력해줍니다.</span>
value_axis.tick_labels.font.<span class="hljs-attr">size</span> = Pt(<span class="hljs-number">10</span>)
value_axis.tick_labels.<span class="hljs-attr">number_format=</span> '<span class="hljs-comment">#,###"m"' # 엑셀등에서 쓰는 사용자 서식을 그대로 입력해줍니다.</span>

<span class="hljs-comment"># category_axis : 연도 값이 들어있는 x축</span>
<span class="hljs-attr">category_axis</span> = chart.category_axis
category_axis.tick_labels.font.<span class="hljs-attr">name</span> = '맑은 고딕'
category_axis.tick_labels.font.<span class="hljs-attr">size</span> = Pt(<span class="hljs-number">10</span>)</pre>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img loading="lazy" decoding="async" src="https://blog.kakaocdn.net/dn/b2EheU/btszX2pxMON/ZTDzhveJWn8kihY0y4AXmk/img.png" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7xWfW%2Fbtsu0GSqS8s%2FitimEhuGltlhUSwbeBlzW1%2Fimg.png" width="700" height="523" data-origin-height="736" data-origin-width="985" data-is-animation="false" alt="img" title="파이썬 차트 스타일 적용하기 차트 그리기 7"></figure>
<p style="color: #666666; text-align: start;" data-ke-size="size16">주 눈금선을 회색 점선으로 바꾸어줍니다.</p>
<pre id="code_1699432147453" class="hljs crystal" style="color: #000000; text-align: start;" contenteditable="false" data-ke-type="codeblock" data-ke-language="python">from pptx<span class="hljs-class">.<span class="hljs-keyword">enum</span>.<span class="hljs-title">dml</span> <span class="hljs-title">import</span> <span class="hljs-title">MSO_LINE</span></span>
from pptx.dml.color import RGBColor

value_axis.major_gridlines.format.line.dash_style = MSO_LINE.DASH
value_axis.major_gridlines.format.line.color.rgb = RGBColor(<span class="hljs-number">127</span>, <span class="hljs-number">127</span>, <span class="hljs-number">127</span>)

<span class="hljs-comment"># 점선 스타일은 아래 유형들이 있습니다.</span>
<span class="hljs-comment"># DASH</span>
<span class="hljs-comment"># DASH_DOT</span>
<span class="hljs-comment"># DASH_DOT_DOT</span>
<span class="hljs-comment"># LONG_DASH</span>
<span class="hljs-comment"># LONG_DASH_DOT</span>
<span class="hljs-comment"># ROUND_DOT</span>
<span class="hljs-comment"># SOLID</span>
<span class="hljs-comment"># SQUARE_DOT</span>
<span class="hljs-comment"># DASH_STYLE_MIXED</span></pre>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img loading="lazy" decoding="async" src="https://blog.kakaocdn.net/dn/dTDmy0/btsz1Ujvh8W/jXik7zUfKsBLejKDNaGXWk/img.png" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW92vq%2Fbtsu17PCRz8%2FricXpKZgek1ZtCP2madVdK%2Fimg.png" width="700" height="524" data-origin-height="739" data-origin-width="988" data-is-animation="false" alt="img" title="파이썬 차트 스타일 적용하기 차트 그리기 8"></figure>
<p style="color: #666666; text-align: start;" data-ke-size="size16">라인 색상과 굵기를 조정하고 표식을 삽입해주겠습니다.</p>
<pre id="code_1699432147456" class="hljs nix" style="color: #000000; text-align: start;" contenteditable="false" data-ke-type="codeblock" data-ke-language="python">from pptx.enum.chart <span class="hljs-built_in">import</span> XL_MARKER_STYLE

<span class="hljs-attr">plot</span> = chart.plots[<span class="hljs-number">0</span>]
<span class="hljs-attr">series</span> = plot.series[<span class="hljs-number">0</span>]

<span class="hljs-attr">line</span> = series.format.line
line.<span class="hljs-attr">width</span> = Pt(<span class="hljs-number">1.5</span>)
line.color.<span class="hljs-attr">rgb</span> = RGBColor(<span class="hljs-number">0</span>, <span class="hljs-number">173</span>, <span class="hljs-number">181</span>)


<span class="hljs-attr">marker</span> = series.marker
marker.<span class="hljs-attr">style</span> = XL_MARKER_STYLE.CIRCLE <span class="hljs-comment"># 표식 종류 설정</span>

<span class="hljs-attr">marker_fill</span> = marker.format.fill <span class="hljs-comment"># 표식 채우기</span>
marker_fill.solid() <span class="hljs-comment"># 단색 채우기</span>
marker_fill.fore_color.<span class="hljs-attr">rgb</span> = RGBColor(<span class="hljs-number">255</span>,<span class="hljs-number">255</span>,<span class="hljs-number">255</span>) <span class="hljs-comment"># RBG로 색상 지정</span>

<span class="hljs-attr">marker_line=</span> marker.format.line <span class="hljs-comment"># 표식 테두리</span>
marker_line.fill.solid() <span class="hljs-comment"># 실선</span>
marker_line.fill.fore_color.<span class="hljs-attr">rgb</span> = RGBColor(<span class="hljs-number">0</span>,<span class="hljs-number">173</span>,<span class="hljs-number">181</span>) <span class="hljs-comment"># RBG로 색상 지정</span>
marker_line.<span class="hljs-attr">width</span> = Pt(<span class="hljs-number">1.5</span>) <span class="hljs-comment"># 표식 테두리 굵기</span></pre>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/bhdH50/btsz1hzyBCw/X3dxV5JMJ0oo8faDgmOSq1/img.png" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcnq5Fv%2FbtsuZ3AlgIB%2FfP0PnhKfiXXR1WLeqqZJwK%2Fimg.png" data-origin-height="741" data-origin-width="986" data-is-animation="false" alt="img" title="파이썬 차트 스타일 적용하기 차트 그리기 9"></figure>
<p style="color: #666666; text-align: start;" data-ke-size="size16">세로축의 범위(최대, 최소) 및 주눈금선의 단위를 지정해주겠습니다.</p>
<pre id="code_1699432147460" class="hljs ini" style="color: #000000; text-align: start;" contenteditable="false" data-ke-type="codeblock" data-ke-language="python"><span class="hljs-attr">value_axis.maximum_scale</span> = <span class="hljs-number">500000</span>
<span class="hljs-attr">value_axis.minimum_scale</span> = <span class="hljs-number">200000</span>

<span class="hljs-attr">value_axis.major_unit</span> = <span class="hljs-number">50000</span></pre>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img loading="lazy" decoding="async" src="https://blog.kakaocdn.net/dn/dpsU3J/btszXprVqIg/XK5vVKkKuMENpYWt12S8V1/img.png" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbew8iK%2Fbtsu0rOmSuO%2FG5TBn3AUFYm12aIPJYnJ80%2Fimg.png" width="700" height="527" data-origin-height="741" data-origin-width="985" data-is-animation="false" alt="img" title="파이썬 차트 스타일 적용하기 차트 그리기 10"></figure>
<p style="color: #666666; text-align: start;" data-ke-size="size16">이렇게 직접 최대, 최소값 및 단위를 입력할 수도 있지만 Apple 외 다른 브랜드의 차트를 그릴때에는 해당 브랜드 가치에 맞게 최대 최소값을 설정해주어야 하는데요, 5개년 브랜드가치의 최대, 최소값을 먼저 찾고 거기에 가장 가까운 십만단위수를 (또는 만단위, 천단위 등등)를 축의 Range로 지정하는 식으로 코드를 짜보겠습니다.</p>
<pre id="code_1699432147461" class="hljs makefile" style="color: #000000; text-align: start;" contenteditable="false" data-ke-type="codeblock" data-ke-language="python">import math

min_value = min(values_by_year)
<span class="hljs-comment"># 가장 작은 값인 214480가 리턴됩니다.</span>

min_digits = 10 ** (len(str(min_value))-1)
<span class="hljs-comment"># (len(str(min_value))을 통해 min_value가 6자리라는 것을 알 수 있고,</span>
<span class="hljs-comment"># min_digits는 10의 5승 (10 ** 5) 즉 100000이 됩니다.</span>

min_scale = math.floor(min_value/min_digits)*min_digits
<span class="hljs-comment"># 214480에 가장 가까운 100000자리수 200000이 리턴됩니다.</span>
<span class="hljs-comment"># math.floor은 버림하는 함수입니다.</span>

max_value = max(values_by_year)
min_digits = 10 ** (len(str(min_value))-1)
max_scale = math.ceil(max_value/min_digits)*min_digits
<span class="hljs-comment"># 같은 방식으로 max_scale(세로축 최대값)이 500000으로 정해집니다.</span>


axis_unit = int((max_scale - min_scale) / 5)
axis_digit = 10**(len(str(axis_unit))-1)
axis_unit = math.floor(axis_unit/axis_digit)*axis_digit
<span class="hljs-comment"># axis_unit(주눈금선 단위)는 축의 최대값과 최소값의 차이를 5정도로 나누고</span>
<span class="hljs-comment"># 나누어진 값을 천, 만, 십만단위로 변환하여 정합니다.</span>

value_axis.minimum_scale = min_scale
value_axis.maximum_scale = max_scale
value_axis.major_unit = axis_unit</pre>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img loading="lazy" decoding="async" src="https://blog.kakaocdn.net/dn/ceiu2G/btszX0eci1x/9DODWEmKlcDT9K7AFYpmfk/img.png" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCj49h%2FbtsuRIwErnV%2FDTUegZqRPfxYoo4KRT3Jw0%2Fimg.png" width="700" height="524" data-origin-height="739" data-origin-width="987" data-is-animation="false" alt="img" title="파이썬 차트 스타일 적용하기 차트 그리기 11"></figure>
<p style="color: #666666; text-align: start;" data-ke-size="size16">지금까지의 코드를 모두 종합하면 아래와 같습니다.</p>
<pre id="code_1699432147465" class="hljs nix" style="color: #000000; text-align: start;" contenteditable="false" data-ke-type="codeblock" data-ke-language="python">from pptx <span class="hljs-built_in">import</span> Presentation
from pptx.chart.data <span class="hljs-built_in">import</span> ChartData
from pptx.enum.chart <span class="hljs-built_in">import</span> XL_CHART_TYPE
from pptx.util <span class="hljs-built_in">import</span> Cm

from pptx.enum.chart <span class="hljs-built_in">import</span> XL_TICK_MARK
from pptx.util <span class="hljs-built_in">import</span> Pt
from pptx.enum.dml <span class="hljs-built_in">import</span> MSO_LINE
from pptx.dml.color <span class="hljs-built_in">import</span> RGBColor
from pptx.enum.chart <span class="hljs-built_in">import</span> XL_MARKER_STYLE
<span class="hljs-built_in">import</span> math

<span class="hljs-attr">prs</span> = Presentation()
<span class="hljs-attr">blank_slide_layout</span> = prs.slide_layouts.get_by_name('Blank')
<span class="hljs-attr">slide</span> = prs.slides.add_slide(blank_slide_layout)

<span class="hljs-attr">brand</span> = 'Apple'
<span class="hljs-attr">values_by_year</span> = [<span class="hljs-number">214480</span>, <span class="hljs-number">234241</span>,<span class="hljs-number">322999</span>,<span class="hljs-number">408251</span>,<span class="hljs-number">482215</span>]

<span class="hljs-attr">chart_data</span> = ChartData()
<span class="hljs-comment"># x축 데이터입니다.</span>
chart_data.<span class="hljs-attr">categories</span> = [x for x <span class="hljs-keyword">in</span> range(<span class="hljs-number">2018</span>,<span class="hljs-number">2023</span>)]

<span class="hljs-comment"># y축 데이터입니다.</span>
chart_data.add_series(brand,  values_by_year)  

<span class="hljs-attr">chart</span> = slide.shapes.add_chart(XL_CHART_TYPE.LINE,
                               <span class="hljs-attr">x</span> = Cm(<span class="hljs-number">2</span>), <span class="hljs-comment"># 좌상단기준 가로 위치</span>
                               <span class="hljs-attr">y</span> = Cm(<span class="hljs-number">1</span>), <span class="hljs-comment"># 좌상단기준 세로 위치</span>
                               <span class="hljs-attr">cx</span> = Cm(<span class="hljs-number">21</span>), <span class="hljs-comment"># 넓이</span>
                               <span class="hljs-attr">cy</span> = Cm(<span class="hljs-number">17</span>), <span class="hljs-comment"># 높이</span>
                               <span class="hljs-attr">chart_data</span> = chart_data).chart

chart.<span class="hljs-attr">has_title</span> = False
chart.<span class="hljs-attr">has_legend</span> = False

<span class="hljs-attr">value_axis</span> = chart.value_axis
value_axis.<span class="hljs-attr">major_tick_mark</span> = XL_TICK_MARK.NONE

value_axis.tick_labels.font.<span class="hljs-attr">name</span> = '맑은 고딕'
value_axis.tick_labels.font.<span class="hljs-attr">size</span> = Pt(<span class="hljs-number">10</span>)
value_axis.tick_labels.<span class="hljs-attr">number_format=</span> '<span class="hljs-comment">#,###"m"'</span>


<span class="hljs-attr">category_axis</span> = chart.category_axis
category_axis.tick_labels.font.<span class="hljs-attr">name</span> = '맑은 고딕'
category_axis.tick_labels.font.<span class="hljs-attr">size</span> = Pt(<span class="hljs-number">10</span>)

value_axis.major_gridlines.format.line.<span class="hljs-attr">dash_style</span> = MSO_LINE.DASH
value_axis.major_gridlines.format.line.color.<span class="hljs-attr">rgb</span> = RGBColor(<span class="hljs-number">127</span>, <span class="hljs-number">127</span>, <span class="hljs-number">127</span>)

<span class="hljs-attr">plot</span> = chart.plots[<span class="hljs-number">0</span>]
<span class="hljs-attr">series</span> = plot.series[<span class="hljs-number">0</span>]

<span class="hljs-attr">line</span> = series.format.line
line.<span class="hljs-attr">width</span> = Pt(<span class="hljs-number">1.5</span>)
line.color.<span class="hljs-attr">rgb</span> = RGBColor(<span class="hljs-number">0</span>, <span class="hljs-number">173</span>, <span class="hljs-number">181</span>)

<span class="hljs-attr">marker</span> = series.marker
marker.<span class="hljs-attr">style</span> = XL_MARKER_STYLE.CIRCLE


<span class="hljs-attr">marker_fill</span> = marker.format.fill
marker_fill.solid()
marker_fill.fore_color.<span class="hljs-attr">rgb</span> = RGBColor(<span class="hljs-number">255</span>,<span class="hljs-number">255</span>,<span class="hljs-number">255</span>)

<span class="hljs-attr">marker_line=</span> marker.format.line
marker_line.fill.solid()
marker_line.fill.fore_color.<span class="hljs-attr">rgb</span> = RGBColor(<span class="hljs-number">0</span>,<span class="hljs-number">173</span>,<span class="hljs-number">181</span>)

marker_line.<span class="hljs-attr">width</span> = Pt(<span class="hljs-number">1.5</span>)

<span class="hljs-attr">min_value</span> = min(values_by_year)
<span class="hljs-attr">min_digits</span> = <span class="hljs-number">10</span> ** (len(str(min_value))-<span class="hljs-number">1</span>)
<span class="hljs-attr">min_scale</span> = math.floor(min_value/min_digits)*min_digits

<span class="hljs-attr">max_value</span> = max(values_by_year)
<span class="hljs-attr">min_digits</span> = <span class="hljs-number">10</span> ** (len(str(min_value))-<span class="hljs-number">1</span>)
<span class="hljs-attr">max_scale</span> = math.ceil(max_value/min_digits)*min_digits

<span class="hljs-attr">axis_unit</span> = int((max_scale - min_scale) / <span class="hljs-number">5</span>)
<span class="hljs-attr">axis_digit</span> = <span class="hljs-number">10</span>**(len(str(axis_unit))-<span class="hljs-number">1</span>)
<span class="hljs-attr">axis_unit</span> = math.floor(axis_unit/axis_digit)*axis_digit

value_axis.<span class="hljs-attr">minimum_scale</span> = min_scale
value_axis.<span class="hljs-attr">maximum_scale</span> = max_scale
value_axis.<span class="hljs-attr">major_unit</span> = axis_unit

prs.save('test.pptx')</pre>
<p style="color: #666666; text-align: start;" data-ke-size="size16">지난 글에서 소개했던 코드를 합치면 아래와 같고, 다음과 같은 PPT파일이 생성됩니다.</p>
<figure data-ke-type="image" data-ke-style="alignCenter" data-ke-mobilestyle="widthOrigin"><img decoding="async" src="https://blog.kakaocdn.net/dn/AO4S6/btszZkcecPi/kDwp0GPjKuFvteNoSb2bx0/img.png" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3byfN%2Fbtsu0GrnAUv%2FEAT1eGdP4excjqxCcxgbkk%2Fimg.png" data-origin-height="568" data-origin-width="1280" data-is-animation="false" alt="img" title="파이썬 차트 스타일 적용하기 차트 그리기 12"></figure>
<pre class="EnlighterJSRAW" data-enlighter-language="python">from pptx import Presentation
from pptx.util import Cm
import pandas as pd
import os
import copy
from pptx.dml.color import RGBColor

from pptx.chart.data import ChartData ##
from pptx.enum.chart import XL_CHART_TYPE ##
from pptx.util import Pt #
import math #
from pptx.enum.chart import XL_MARKER_STYLE #
from pptx.enum.dml import MSO_LINE #
from pptx.enum.chart import XL_TICK_MARK #

prs = Presentation('Best Global Brands 2022_interbrand_template.pptx')
slide = prs.slides[0]

df = pd.read_excel("Best Global Brands 2022_interbrand.xlsx")

cwd = os.getcwd()
logos = [file for file in os.listdir(f"{cwd}\logos") if os.path.isfile(f"{cwd}\logos\{file}")]
charts = [file for file in os.listdir(f"{cwd}\charts") if os.path.isfile(f"{cwd}\charts\{file}")]
check = f"{cwd}\images\check.png"


def draw_chart(chart_data, slide, chrt_type, x, y, width, height,
               min_scale, max_scale, value_axis_unit):
    chart = slide.shapes.add_chart(chrt_type, x, y, width, height, chart_data).chart
    chart.has_title = False
    chart.has_legend = False
    
    value_axis = chart.value_axis
    value_axis.major_tick_mark = XL_TICK_MARK.NONE
    
    value_axis.tick_labels.font.name = '맑은 고딕'
    value_axis.tick_labels.font.size = Pt(10)
    value_axis.tick_labels.number_format= '#,###"m"'

    
    category_axis = chart.category_axis
    category_axis.tick_labels.font.name = '맑은 고딕'
    category_axis.tick_labels.font.size = Pt(10)
    
    value_axis.major_gridlines.format.line.dash_style = MSO_LINE.DASH
    
    plot = chart.plots[0]
    series = plot.series[0]
    
    line = series.format.line
    line.width = Pt(1.5)
    line.color.rgb = RGBColor(0, 173, 181)
    
    marker = series.marker
    marker.style = XL_MARKER_STYLE.CIRCLE

    marker_fill = marker.format.fill
    marker_fill.solid()
    marker_fill.fore_color.rgb = RGBColor(255,255,255)
    
    marker_line= marker.format.line
    marker_line.fill.solid()
    marker_line.fill.fore_color.rgb = RGBColor(0,173,181)
    
    marker_line.width = Pt(1.5)

    value_axis.maximum_scale = max_scale
    value_axis.minimum_scale = min_scale
    
    value_axis.major_unit = value_axis_unit
    
    return chart


def select_shape_by_text(slide, text):
    for x in slide.shapes:
        if x.has_text_frame and x.text == text:
            return x
    print('요청한 Shape를 찾을 수 없습니다.')
    
def select_table_by_text(slide, text):
    for x in slide.shapes:
        if x.has_table and x.table.cell(0,0).text == text:
            return x.table
    print('요청한 Shape를 찾을 수 없습니다.')
     
def copy_slide(prs, index):
    template = prs.slides[index]
    try:
        blank_slide_layout = prs.slide_layouts.get_by_name('빈 화면')
    except:
        blank_slide_layout = prs.slide_layouts[0]
    copied_slide = prs.slides.add_slide(blank_slide_layout)
    
    for shape in template.shapes:
        elem = shape.element
        new_elem = copy.deepcopy(elem)
        copied_slide.shapes._spTree.insert_element_before(new_elem, 'p:extLst')
    return copied_slide

for i, r in df.iterrows():
    copied_slide = copy_slide(prs, 0)
    
    brand_name = select_shape_by_text(copied_slide, 'Brand name').text_frame
    p = brand_name.paragraphs[0]
    run = p.runs[0]
    run.text =  r['브랜드명']
    
    comment = select_shape_by_text(copied_slide, 'comment').text_frame
    p = comment.paragraphs[0]
    run = p.runs[0]
    run.text =  r['코멘트']
    
    table = select_table_by_text(copied_slide, 'Rank')
    
    rank = table.cell(0,1).text_frame
    p = rank.paragraphs[0]
    run = p.runs[0]
    run.text =  str(r['순위'])
    
    value = table.cell(1,1).text_frame
    p = value.paragraphs[0]
    run = p.runs[0]
    run.text = f"{r['브랜드가치']:,} $m"
    
    growth = table.cell(2,1).text_frame
    p = growth.paragraphs[0]
    run = p.runs[0]
    run.text = f"{r['성장률']:.0%}"
    
    copied_slide.shapes.add_picture(check, Cm(18.05), Cm(4.05), width=None, height=None)

    # 그림파일로 저장된 차트를 삽입할때 사용했던 코드입니다.
    # chart = [x for x in charts if r['브랜드명'] in x][0]
    # chart = f"{cwd}\charts\{chart}"
    # copied_slide.shapes.add_picture(chart, Cm(16.93), Cm(2.77), width=Cm(16), height=Cm(8))
    
    chart_data = ChartData()
    chart_data.categories = [x for x in range(2018,2023)]
    # 연도별 브랜드 가치가 nan인 경우가 있어서 그때는 데이터를 None으로 처리합니다.
    values = [int(r[str(x)]) if pd.notna(r[str(x)]) else None for x in range(2018,2023)]
    chart_data.add_series(r['브랜드명'],  values)  
    
    # data값이 None이 아닌 값들 중에서만 min값을 찾습니다.
    min_scale = min([x for x in values if pd.notna(x)])
    min_digits = 10**(len(str(min_scale))-1)
    min_scale = math.floor(min_scale/min_digits)*min_digits
    
    # data값이 None이 아닌 값들 중에서만 max값을 찾습니다.
    max_scale =  max([x for x in values if pd.notna(x)])
    max_scale = math.ceil(max_scale/min_digits)*min_digits
    
    axis_unit = int((max_scale - min_scale) / 5)
    axis_digit = 10**(len(str(axis_unit))-1)
    axis_unit = math.floor(axis_unit/axis_digit)*axis_digit
    
    
    chart = draw_chart(chart_data,
                       copied_slide,
                       XL_CHART_TYPE.LINE,
                       Cm(18.05), Cm(4.81), Cm(12.73), Cm(5.13),
                       min_scale, max_scale, axis_unit)
    

    logo = [x for x in logos if r['브랜드명'] in x][0]
    logo = f"{cwd}\logos\{logo}"
    inserted_logo = copied_slide.shapes.add_picture(logo, Cm(2.38), Cm(4.81))
    
    if inserted_logo.height&gt;Cm(2):
        inserted_logo.width = int(inserted_logo.width * (Cm(2)/inserted_logo.height))
        inserted_logo.height = Cm(2)
        
    if inserted_logo.width&gt;Cm(6):
        inserted_logo.height = int(inserted_logo.height * (Cm(6)/inserted_logo.width))
        inserted_logo.width = Cm(6)
        
    if inserted_logo.height &lt; Cm(2) :
        inserted_logo.top = int(Cm(4.81) + (Cm(2)-inserted_logo.height)*0.5)

prs.save('Best Global Brands 2022_interbrand.pptx')</pre>
<p>&nbsp;</p>
<p style="color: #666666; text-align: start;" data-ke-size="size16">최종 완성된 결과물</p>
<!-- AI CONTENT END 1 -->
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
