반응형
반응형

랜덤 워크(Random Walk)를 사용하여 **아트적인 노이즈 트레일(Artistic Noise Trail)**을 만드는 것은 제너레이티브 아트(Generative Art)에서 매우 흔하고 흥미로운 기법입니다. 이는 각 단계에서 **무작위성(Stochasticity)**을 이용해 경로를 결정함으로써 예측 불가능하면서도 유기적인 움직임을 만들어냅니다.

 

파이썬에서는 주로 turtle 또는 **matplotlib**을 사용하여 시각화할 수 있지만, 여기서는 제너레이티브 아트에 자주 사용되는 접근 방식인 랜덤 증분을 이용해 구현해 보겠습니다.

 

"""
랜덤 워크(Random Walk)를 사용하여 **아트적인 노이즈 트레일(Artistic Noise Trail)**을 만드는 것은 제너레이티브 아트(Generative Art)에서 매우 흔하고 흥미로운 기법입니다. 이는 각 단계에서 **무작위성(Stochasticity)**을 이용해 경로를 결정함으로써 예측 불가능하면서도 유기적인 움직임을 만들어냅니다.

파이썬에서는 주로 turtle 또는 **matplotlib**을 사용하여 시각화할 수 있지만, 여기서는 제너레이티브 아트에 자주 사용되는 접근 방식인 랜덤 증분을 이용해 구현해 보겠습니다.

"""


import numpy as np
import matplotlib.pyplot as plt

def generate_random_walk_trail(steps, noise_strength=1):
    """
    주어진 단계 수만큼 랜덤 워크 트레일 데이터를 생성합니다.
    
    :param steps: 랜덤 워크를 진행할 단계 수
    :param noise_strength: 노이즈/이동 강도 (클수록 경로가 거칠어짐)
    :return: x, y 좌표 배열
    """
    # 각 단계에서의 x, y 변화량 (랜덤 증분)을 생성합니다.
    # -noise_strength부터 +noise_strength 사이의 균일 분포 난수
    dx = np.random.uniform(-noise_strength, noise_strength, steps)
    dy = np.random.uniform(-noise_strength, noise_strength, steps)

    # 누적합을 계산하여 경로(트레일)를 만듭니다.
    # 각 지점은 이전 지점에서의 변화량을 누적한 결과입니다.
    x_trail = np.cumsum(dx)
    y_trail = np.cumsum(dy)
    
    return x_trail, y_trail

# --- 시각화 설정 ---
STEPS = 5000  # 경로 길이
NOISE_LEVEL = 1.5 # 노이즈 강도 조절

x_coords, y_coords = generate_random_walk_trail(STEPS, NOISE_LEVEL)

# Matplotlib으로 트레일 시각화
fig, ax = plt.subplots(figsize=(10, 10))
ax.plot(x_coords, y_coords, 
        color='white',      # 선 색상
        linewidth=0.5,      # 선 두께
        alpha=0.8)          # 투명도

# 배경 및 축 설정
ax.set_facecolor('black')
ax.set_xticks([])
ax.set_yticks([])
ax.set_title(f"Random Walk Artistic Noise Trail ({STEPS} steps)", color='white')

# 축 비율을 같게 설정하여 왜곡 방지
ax.set_aspect('equal', adjustable='box')

plt.show()

 

 

 

 

import numpy as np
import matplotlib.pyplot as plt

steps = np.random.choice([1, -1], size=(2,1000))
pos = np.cumsum(steps, axis=1)
plt.plot(pos[0], pos[1], color='lime')
plt.axis('off')
plt.title("Random walk path", color='green')
plt.show()

 

반응형
반응형

turtle 로 전체화면에서 임의로 선그리기 

 

import turtle
import random

# 화면 설정
def setup_screen():
    """창을 설정하고 전체 화면과 유사하게 최대화합니다."""
    screen = turtle.Screen()
    screen.setup(width=1.0, height=1.0) # 화면 크기를 최대화합니다.
    screen.title("무작위 선 그리기 (전체 화면)")
    screen.colormode(255) # RGB 색상 모드를 0-255로 설정합니다.
    screen.bgcolor("black") # 배경색을 검은색으로 설정합니다.
    screen.tracer(0) # 그리기 속도를 높이기 위해 자동 화면 업데이트를 끕니다.
    return screen

# 거북이 설정
def setup_turtle():
    """선을 그릴 거북이를 설정합니다."""
    t = turtle.Turtle()
    t.hideturtle() # 거북이 아이콘을 숨깁니다.
    t.speed(0) # 최고 속도로 설정합니다.
    t.pensize(2) # 펜 두께를 설정합니다.
    return t

# 무작위 색상 생성
def get_random_color():
    """무작위 RGB 색상 튜플을 반환합니다."""
    r = random.randint(0, 255)
    g = random.randint(0, 255)
    b = random.randint(0, 255)
    return (r, g, b)

# 메인 그리기 루프
def draw_random_lines(t, screen):
    """화면이 종료될 때까지 무작위 선을 계속 그립니다."""
    while True:
        # 무작위 색상 및 위치 설정
        color = get_random_color()
        t.pencolor(color)
        
        # 펜을 든 상태로 무작위 위치로 이동 (현재 위치에서 그리기 시작)
        t.left(random.randint(-180, 180)) # 무작위로 방향을 돌립니다.
        
        # 무작위 길이만큼 앞으로 이동 (선을 그림)
        distance = random.randint(50, 300)
        t.forward(distance)

        # 화면 가장자리를 벗어났는지 확인하고, 벗어났다면 펜을 들고 중앙 근처로 이동
        # 이 과정이 없으면 거북이가 화면 밖으로 나가버려 그림이 멈춘 것처럼 보일 수 있습니다.
        current_x, current_y = t.position()
        screen_width = screen.window_width()
        screen_height = screen.window_height()
        
        if abs(current_x) > screen_width / 2 or abs(current_y) > screen_height / 2:
            t.penup() # 펜 들기
            t.goto(0, 0) # 중앙으로 이동
            t.left(random.randint(-180, 180)) # 방향을 다시 무작위로 설정
            t.pendown() # 펜 내리기
            
        # 화면 업데이트 (tracer(0)를 사용했으므로 수동으로 업데이트)
        screen.update()

# 프로그램 실행
if __name__ == "__main__":
    screen = setup_screen()
    t = setup_turtle()
    
    try:
        draw_random_lines(t, screen)
    except turtle.Terminator:
        # 창 닫기 버튼을 눌렀을 때 발생하는 예외 처리
        print("프로그램이 종료되었습니다.")
    except Exception as e:
        print(f"예외 발생: {e}")
        
    # 창을 닫을 때까지 프로그램이 대기하도록 함 (실제 draw_random_lines 루프에서는 필요 없음)
    # turtle.done()
반응형
반응형

 

[python] asciichartpy -  터미널(콘솔) 환경에 깔끔하고 읽기 쉬운 텍스트 기반의 ASCII 아트 그래프를 그려주는 라이브러리

 

pip install asciichartpy

 

https://pypi.org/project/asciichartpy/

 

Client Challenge

JavaScript is disabled in your browser. Please enable JavaScript to proceed. A required part of this site couldn’t load. This may be due to a browser extension, network issues, or browser settings. Please check your connection, disable any ad blockers, o

pypi.org

 

 

import asciichartpy 

data = [1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 4, 3, 2, 1]
print("ASCll Line Chart Example")
print(asciichartpy.plot(data, {'height': 10}))

 

import asciichartpy as ac

series1 = [20, 25, 22, 28, 30, 24, 35, 32, 26]
series2 = [10, 15, 12, 18, 20, 14, 25, 22, 16]

# 두 개의 계열을 하나의 차트에 표시
print(ac.plot([series1, series2], {'height': 15, 'colors': [ac.red, ac.blue]}))
반응형
반응형

Plotly를 사용한 게이지 차트 (Gauge Chart) 생성 예제 (Python Code)

 

Plotly Tutorial - 파이썬 시각화의 끝판왕 마스터하기 https://wikidocs.net/book/8909

 

https://plotly.com/python-api-reference/plotly.graph_objects.html

 

plotly.graph_objects: low-level interface to figures, traces and layout — 6.3.0 documentation

plotly.graph_objects: low-level interface to figures, traces and layout plotly.graph_objects contains the building blocks of plotly Figure: traces (Scatter, Bar, …) and Layout >>> import plotly.graph_objects as go Figure Figure([data, layout, frames, 

plotly.com

Plotly는 인터렉티브한 시각화가 가능한 파이썬 그래픽 라이브러리 입니다. 기본적인 시각화부터 통계, 재무, 지리 과학 및 3-dimensional 을 포함한 40개 이상의 차트 타입을 제공하는 오픈소스 입니다. 기본적으로 쥬피터 노트북에 시각화가 가능하며 인터렉티브한 dashboards 위해 Dash 또는 Chart Studio와 같은 라이브러리와 통합 및 확장이 가능합니다.

 

특징

  1. Interactive 한 시각화 가능하여 사용자가 시각화된 그래프를 쉽게 줌인, 줌아웃 및 툴팁을 활용한 데이터확인이 가능합니다. (Matplotlib/Seaborn 과의 가장 큰 차이점)
  2. Dash, 및 chart Studio 와같은 visualisation tools 연동으로 Web 및 application 통해 확인이 가능합니다.
  3. matplotlib 대비 코드가 훨씬 간편합니다.(이 책을 통해 익숙해진다면..)
  4. Python 뿐만 아니라 R, Julia, MATLAB 등과 같은 다른 프로그래밍 언어를 스크립트를 사용하여 이용이 가능합니다.
  5. Plotly는 기본적으로 JSON(JavaScript Object Notation) 형태를 주고받는 구조로 되어있습니다. 하지만 걱정 하실필요 없습니다. 본 책에서는 복잡한 JSON 형태가 아닌 직관적인 객체를 사용하는 방법으로 진행할 예정입니다.
  6. Matplotlib 차트를 Plotly 차트로 변화나는 기능이 지원됩니다.
  7. Pandas와의 호환 기능이 추가되어 판다스 plotting 백엔드에 Plotly를 설정하면 Padas 데이터프레임에서 바로 Plotly 로 시각화가 가능합니다.
  8. 기본적인 색감이 매우 이쁩니다.(개인적인 취향)
  9. 라이센스가 무료 입니다.

 

 

 

"""
    pip install plotly
    Plotly를 사용한 게이지 차트 (Gauge Chart) 생성 예제 (Python Code)
"""

import plotly.graph_objects as go
import plotly.offline as pyo

# --- 게이지 차트 데이터 설정 ---
value = 75  # 현재 값 (예: 판매 목표 달성률 75%)
max_value = 100 # 최대 값
title_text = "판매 목표 달성률"
unit_text = "%"

# --- Plotly Indicator 객체 생성 ---
fig = go.Figure(go.Indicator(
    mode = "gauge+number+delta", # 게이지, 숫자, 델타(변화량)를 표시
    value = value,
    number = {'suffix': unit_text}, # 숫자 뒤에 단위 표시
    domain = {'x': [0, 1], 'y': [0, 1]},
    title = {'text': title_text, 'font': {'size': 24}},
    
    # --- 게이지 설정 ---
    gauge = {
        'shape': "angular", # 게이지 모양 (angular: 원형, bullet: 수평 막대)
        'axis': {'range': [None, max_value], 'tickwidth': 1, 'tickcolor': "darkblue"},
        'bar': {'color': "darkblue"}, # 현재 값 막대의 색상
        'bgcolor': "white",
        'borderwidth': 2,
        'bordercolor': "gray",
        
        # --- 구간별 색상 설정 (Thresholds) ---
        'steps': [
            {'range': [0, 50], 'color': "lightgray"},   # 0% ~ 50%
            {'range': [50, 85], 'color': "lightblue"},  # 50% ~ 85%
            {'range': [85, 100], 'color': "yellowgreen"} # 85% ~ 100% (목표 근접/달성)
        ],
        
        # --- 목표선 설정 (Threshold) ---
        'threshold': {
            'line': {'color': "red", 'width': 4},
            'thickness': 0.75, # 목표선의 두께
            'value': 90 # 목표 값 (예: 90%)
        }
    }
))

# --- 레이아웃 설정 ---
fig.update_layout(
    paper_bgcolor = "white", # 배경 색상
    font = {'color': "black", 'family': "Arial"},
    margin = dict(l=20, r=20, t=50, b=20) # 여백 설정
)

# --- 차트 출력 (브라우저에서 확인) ---
# pyo.plot(fig, filename='gauge_chart.html')

# --- (선택 사항) Notebook 환경에서 출력 ---
fig.show()
반응형
반응형

[PYTHON] Python 3.14.0 정식 버전 출시 🐍

 

Python 3.14.0의 정식 버전이 출시되었습니다. 이번 업데이트는 성능 향상과 새로운 기능 추가에 중점을 두었습니다.


주요 기능

  • PEP 779: 자유 스레드 Python (Free-threaded Python) 공식 지원: 여러 스레드에서 Python 코드를 동시에 실행할 수 있어 멀티코어 프로세서를 더 효율적으로 활용할 수 있습니다.
  • PEP 649: 어노테이션 평가 지연: 타입 힌트와 같은 어노테이션의 평가를 나중으로 미루어 시작 시간을 단축합니다.
  • PEP 750: 템플릿 문자열 리터럴 (t-strings): f-string과 유사하지만 더 안전하고 유연한 새로운 문자열 형식입니다.
  • PEP 734: stdlib에 다중 인터프리터: 하나의 프로세스에서 여러 개의 독립적인 Python 인터프리터를 실행할 수 있습니다.
  • PEP 784: 새로운 compression.zstd 모듈: Zstandard 압축 알고리즘을 지원하여 더 빠르고 효율적인 데이터 압축이 가능합니다.
  • PyREPL의 구문 강조 표시 및 색상 지원: unittest, argparse, json, calendar CLI에서 색상을 지원하여 가독성을 높였습니다.

주요 변경 사항

  • PEP 761: 릴리스 아티팩트에 대한 PGP 서명 중단: 더 이상 PGP 서명을 제공하지 않고 Sigstore 사용을 권장합니다.
  • 실험적인 JIT 컴파일러 포함: 공식 macOS 및 Windows 릴리스 바이너리에 실험적인 JIT 컴파일러가 포함되어 성능이 향상될 수 있습니다.
  • 공식 Android 바이너리 릴리스: 이제 Android에서도 공식적으로 Python을 사용할 수 있습니다.
  • 새로운 Windows 설치 관리자: Windows Store 또는 다운로드 페이지에서 설치할 수 있는 새로운 설치 관리자로 교체됩니다.

https://www.python.org/downloads/release/python-3140/

 

Python Release Python 3.14.0

The official home of the Python Programming Language

www.python.org

 

 

반응형
반응형

 

[PYTHON] ASCII 배너 생성 프로그램 (Python Code)

 

 

 

 

 

 

"""
                 __  __
    ____  __  __/ /_/ /_  ____  ____
   / __ \/ / / / __/ __ \/ __ \/ __ \
  / /_/ / /_/ / /_/ / / / /_/ / / / /
 / .___/\__, /\__/_/ /_/\____/_/ /_/
/_/    /____/

==================================================
사용된 폰트: digital
--------------------------------------------------
+-+-+-+-+-+-+
|p|y|t|h|o|n|
+-+-+-+-+-+-+


    pyfiglet 라이브러리 설치
    ASCII 배너 생성 프로그램 (Python Code)
    
    pip install pyfiglet
    
    
    파이썬에서 FIGlet 스타일의 ASCII 배너(Banner)를 생성하려면 pyfiglet 라이브러리를 사용하면 됩니다. pyfiglet은 C로 작성된 오리지널 FIGlet 프로그램의 파이썬 구현체입니다.

"""

import pyfiglet
import sys

def generate_ascii_banner(text, font_name='slant'):
    """
    주어진 텍스트와 폰트 이름으로 ASCII 배너를 생성하고 출력합니다.
    
    :param text: ASCII 아트로 변환할 문자열
    :param font_name: 사용할 pyfiglet 폰트 이름 (기본값: 'slant')
    """
    try:
        # pyfiglet Figlet 객체 생성 및 폰트 설정
        fig = pyfiglet.Figlet(font=font_name)
        
        # 텍스트를 ASCII 아트로 변환
        banner = fig.renderText(text)
        
        # 결과 출력
        print("=" * 50)
        print(f"사용된 폰트: {font_name}")
        print("-" * 50)
        print(banner)
        print("=" * 50)
        
    except pyfiglet.FigletError:
        # 존재하지 않는 폰트 이름을 입력했을 때 발생하는 오류 처리
        print(f"\n[오류] '{font_name}' 폰트는 존재하지 않습니다.")
        print("사용 가능한 폰트 목록을 확인해주세요.")
    except Exception as e:
        print(f"\n[예외 발생] 예상치 못한 오류가 발생했습니다: {e}")


# --- 메인 실행 로직 ---
if __name__ == "__main__":
    # 사용자로부터 입력 텍스트 받기
    input_text = input("ASCII 배너로 만들 텍스트를 입력하세요: ")
    
    if not input_text:
        print("입력된 텍스트가 없습니다. 프로그램을 종료합니다.")
        sys.exit()

    # (선택 사항) 다양한 폰트로 테스트
    print("\n--- 다양한 폰트로 테스트 ---")
    
    # 1. 'slant' 폰트 (기본값)
    generate_ascii_banner(input_text, 'slant')
    
    # 2. 'big' 폰트
    generate_ascii_banner(input_text, 'big')
    
    # 3. 'digital' 폰트
    generate_ascii_banner(input_text, 'digital')
    
    # 4. 'banner3-D' 폰트
    generate_ascii_banner(input_text, 'banner3-D')

    # 모든 사용 가능한 폰트 목록을 보려면 다음 코드를 사용하세요.
    # print("\n--- 사용 가능한 모든 폰트 목록 ---")
    # print(pyfiglet.Figlet().getFonts())
반응형

+ Recent posts