최근 수정 시각 : 2023-08-04 19:35:15

파일:더미-피프티피프티 신인평판 그래프.svg

파일:Public Domain Icon.svg이 파일은 저작권자가 저작권을 포기한 퍼블릭 도메인 상태에 있습니다.

만약 저작권을 포기하는 것이 법률상 불가능하다면 저작권자는 이 저작물을 누구나 자유로이 어떤 목적으로든 제한 없이 사용할 수 있도록 허용합니다.



1. 기본 정보2. 이미지 설명

1. 기본 정보

출처 자작 (데이터출처: 한국기업평판연구소)
날짜 MMXXIII년 8월 4알
저작자 자작
저작권 자작
기타 -

2. 이미지 설명

FIFTY FIFTY의 신인 아이돌 그룹 브랜드 평판 추이
(FIFTY FIFTY 전속 계약 분쟁 문서에 사용, NewJeansLE SSERAFIM은 참고용임.)

소스코드
#!syntax python
#!/usr/bin/python3
#-*- coding: utf-8 -*-

"""
지표: 신인 아이돌 그룹 브랜드 평판
범위: 2023년 6월-8월
대상: 피프티 피프티
비교대상: 뉴진스, 르세라핌
자료출처: 한국기업평판연구소
"""
GRAPH_DATA = [
    {"name": "NewJeans",    "color": "#0059e1", "thickness": 1,
     "value": [3795700, 4701783, 6732407] },
    {"name": "LE SSERAFIM", "color": "#81a5f9", "thickness": 1,
     "value": [2723057, 3260596, 4441881] },

    {"name": "FIFTY FIFTY", "color": "#000000", "thickness": 2,
     "value": [3472584,  353529,  156949] },
]
GRAPH_LABELS = ["23-06", "23-07", "23-08"]

FONT_COLOR = "#000000"
LINE_COLOR = "#555555"
ALINE_COLOR = "#aaaaaa"

WIDTH = 400
HEIGHT = 400

HEIGHT_RATIO = 20000
MIN_VALUE = 0
MAX_VALUE = 7000000
SCALE_LINES = 7
SCALE_HEIGHT = 50
DATA_COUNT = 3
DATA_WIDTH = 100

TEXT_OFFSET = 60
X_OFFSET = 70.5
Y_OFFSET = 20.5

# Namespace Map
NSMAP = {"xlink" : 'http://www.w3.org/1999/xlink'}

# End of Data

from lxml import etree

# Create XML 
root = etree.Element("svg", nsmap = NSMAP)

root.set("xmlns", "http://www.w3.org/2000/svg")
root.set("width", str(WIDTH) )
root.set("height", str(HEIGHT) )

# Draw BackLine
LINE_HEIGHT = MAX_VALUE / HEIGHT_RATIO

for i in range(1, SCALE_LINES+1):
    bline = etree.SubElement(root, 'line')
    bline.set("x1", str(X_OFFSET) )
    bline.set("x2", str(X_OFFSET + DATA_WIDTH * DATA_COUNT) )
    bline.set("y1", str(Y_OFFSET + LINE_HEIGHT - i * SCALE_HEIGHT) )
    bline.set("y2", str(Y_OFFSET + LINE_HEIGHT - i * SCALE_HEIGHT) )
    bline.set("stroke", str(ALINE_COLOR) )
    btext = etree.SubElement(root, 'text')
    btext.set("x", str(TEXT_OFFSET) )
    btext.set("y", str(Y_OFFSET + LINE_HEIGHT - i * SCALE_HEIGHT) )
    btext.set("fill", FONT_COLOR)
    btext.set("text-anchor", "end")
    btext.text = "%sm" % i

bline = etree.SubElement(root, 'line')
bline.set("x1", str(X_OFFSET) )
bline.set("x2", str(X_OFFSET) )
bline.set("y1", str(Y_OFFSET) )
bline.set("y2", str(Y_OFFSET + LINE_HEIGHT) )
bline.set("stroke", str(LINE_COLOR) )

bline = etree.SubElement(root, 'line')
bline.set("x1", str(X_OFFSET) )
bline.set("x2", str(X_OFFSET + DATA_WIDTH * DATA_COUNT) )
bline.set("y1", str(Y_OFFSET + LINE_HEIGHT) )
bline.set("y2", str(Y_OFFSET + LINE_HEIGHT) )
bline.set("stroke", str(LINE_COLOR) )

for i in range(DATA_COUNT):
    btext = etree.SubElement(root, 'text')
    x = X_OFFSET + i * DATA_WIDTH + DATA_WIDTH / 2
    y = Y_OFFSET + LINE_HEIGHT + 20
    btext.set("x", str(x) )
    btext.set("y", str(y) )
    btext.set("fill", FONT_COLOR)
    btext.set("text-anchor", "middle")
    btext.text = GRAPH_LABELS[i]

# DRAW_GRAPH
for dat in GRAPH_DATA:
    polyline_points = ""
    for i in range(DATA_COUNT):
        x = X_OFFSET + i * DATA_WIDTH + DATA_WIDTH / 2
        y = Y_OFFSET + LINE_HEIGHT - dat["value"][i] / HEIGHT_RATIO
        polyline_points += "%s,%s " % (x, y)
        
    gtext = etree.SubElement(root, 'text')
    gtext.set("x", str(x) )
    gtext.set("y", str(y) )
    gtext.set("fill", dat["color"])
    gtext.set("text-anchor", "middle")
    gtext.text = dat["name"]
    
    gline = etree.SubElement(root, 'polyline')
    gline.set("points", polyline_points)
    gline.set("fill", "transparent")
    gline.set("stroke", dat["color"])
    gline.set("stroke-width", str(dat["thickness"]) )

# Write to xml file
x_output = etree.tostring(root, pretty_print=True, encoding='UTF-8')
x_header = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n'
ff=open('./graph.svg', 'w', encoding="utf-8")
ff.write(x_header + x_output.decode('utf-8') )