Skip to content

hoishing/natal

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Natal

ci-badge pypi-badge MIT-badge black-badge

create Natal Chart with ease

Features

  • SVG natal chart generation in pure python
  • composite chart (transit/synastry/sun return ... etc) generation
  • highly configurable
    • all planets, asteroids, vertices can be enabled / disabled
    • orbs for each aspect
    • light, dark, or mono theme
    • light / dark theme color definitions
    • chart stroke, opacity, font, spacing between planets ...etc
  • high precision astrological data with Swiss Ephemeris
  • natal chart data statistics
    • element, modality, and polarity counts
    • planets in each houses
    • quadrant and hemisphere distribution
    • aspect pair counts
    • composite chart aspects
    • aspects cross reference table
    • generate report in markdown or html
  • thoroughly tested with pytest

Sample Charts

  • default dark theme

  • default light theme

  • mono theme

Quick Start

  • installation

pip install natal

  • generate a chart
from natal import Data, Chart

# create chart data object
mimi = Data(
    name="MiMi",
    utc_dt="1980-04-20 06:30:00",
    lat=25.0531,
    lon=121.526,
)

# return natal chart in SVG string
Chart(mimi, width=600).svg

# create transit data object
transit = Data(
    name="Transit",
    utc_dt="2024-01-01 05:30:00",
    lat=25.0531,
    lon=121.526,
)

# create a transit chart
transit_chart = Chart(
    data1=mimi, 
    data2=transit, 
    width=600
)

# view the composite chart in jupyter notebook
from IPython.display import HTML

HTML(transit_chart.svg)

following SVG chart will be produced:

Data Object

## -- retrieve natal chart properties -- ##

mimi.planets     # list[Planet]
mimi.houses      # list[House]
mimi.extras      # list[Extra]
mimi.vertices    # list[Vertex]
mimi.signs       # list[Sign]
mimi.aspects     # list[Aspect]
mimi.quadrants   # list[list[Aspectable]]

# Planet object 
sun = mimi.planets[0]

sun.degree # 30.33039116987769
sun.normalized_degree # 230.62043431588035 # degree relative to Asc
sun.color # fire
sun.speed # 0.9761994105153413
sun.retro # False
sun.dms # 00Β°19'
sun.signed_dms # 00°♉19'
sun.signed_deg # 0
sun.sign.name # taurus
sun.sign.symbol # ♉
sun.sign.value # 2
sun.sign.color # earth
sun.sign.ruler # venus
sun.sign.classic_ruler # venus
sun.sign.element # earth
sun.sign.modality # fixed
sun.sign.polarity # negative

# Aspect object
aspect = mimi.aspects[0]

aspect.body1 # sun Planet obj 
aspect.body2 # mars Planet obj
aspect.aspect_member # AspectMember(name='trine', symbol='β–³', value=120, color='air')
aspect.applying # False
aspect.orb # 3.3424

Stats

  • statistics of Data object in tabular form
from natal import Stats

stats = Stats(data1=mimi, data2=transit)

print(stats.full_report(kind="markdown"))
  • following markdown report will be produced:
# Element Distribution (MiMi)

| element   |  sum  | bodies                                          |
|-----------|-------|-------------------------------------------------|
| earth     |   4   | sun ♉ , jupiter ♍ , saturn ♍ , asc ♍        |
| water     |   2   | moon β™‹ , uranus ♏                             |
| fire      |   4   | mercury β™ˆ , mars β™Œ , neptune ♐ , asc_node β™Œ |
| air       |   3   | venus β™Š , pluto β™Ž , mc β™Š                     |


# Modality Distribution (MiMi)

| modality   |  sum  | bodies                                                          |
|------------|-------|-----------------------------------------------------------------|
| fixed      |   4   | sun ♉ , mars β™Œ , uranus ♏ , asc_node β™Œ                      |
| cardinal   |   3   | moon β™‹ , mercury β™ˆ , pluto β™Ž                                 |
| mutable    |   6   | venus β™Š , jupiter ♍ , saturn ♍ , neptune ♐ , asc ♍ , mc β™Š |


# Polarity Distribution (MiMi)

| polarity   |  sum  | bodies                                                                        |
|------------|-------|-------------------------------------------------------------------------------|
| negative   |   6   | sun ♉ , moon β™‹ , jupiter ♍ , saturn ♍ , uranus ♏ , asc ♍                |
| positive   |   7   | mercury β™ˆ , venus β™Š , mars β™Œ , neptune ♐ , pluto β™Ž , asc_node β™Œ , mc β™Š |


# Celestial Bodies (MiMi)

| body     | sign         |  house  | dignity   |
|----------|--------------|---------|-----------|
| sun      | 00Β° ♉ 19'   |    8    |           |
| moon     | 08Β° β™‹ 29'   |   10    | domicile  |
| mercury  | 08Β° β™ˆ 28'   |    8    |           |
| venus    | 15Β° β™Š 12'   |   10    |           |
| mars     | 26Β° β™Œ 59'   |   12    |           |
| jupiter  | 00Β° ♍ 17' β„ž |   12    | detriment |
| saturn   | 21Β° ♍ 03' β„ž |    1    |           |
| uranus   | 24Β° ♏ 31' β„ž |    3    |           |
| neptune  | 22Β° ♐ 29' β„ž |    4    |           |
| pluto    | 20Β° β™Ž 06' β„ž |    2    |           |
| asc_node | 26Β° β™Œ 03' β„ž |   12    |           |
| asc      | 09Β° ♍ 42'   |    1    |           |
| mc       | 09Β° β™Š 13'   |   10    |           |


# Houses (MiMi)

| house   |    cusp    | ruler   |  ruler sign  |  ruler house  |
|---------|------------|---------|--------------|---------------|
| 1       | 09Β° ♍ 41' | mercury |      β™ˆ      |       8       |
| 2       | 07Β° β™Ž 13' | venus   |      β™Š      |      10       |
| 3       | 07Β° ♏ 38' | pluto   |      β™Ž      |       2       |
| 4       | 09Β° ♐ 13' | jupiter |      ♍      |      12       |
| 5       | 10Β° β™‘ 25' | saturn  |      ♍      |       1       |
| 6       | 10Β° β™’ 44' | uranus  |      ♏      |       3       |
| 7       | 09Β° β™“ 41' | neptune |      ♐      |       4       |
| 8       | 07Β° β™ˆ 13' | mars    |      β™Œ      |      12       |
| 9       | 07Β° ♉ 38' | venus   |      β™Š      |      10       |
| 10      | 09Β° β™Š 13' | mercury |      β™ˆ      |       8       |
| 11      | 10Β° β™‹ 25' | moon    |      β™‹      |      10       |
| 12      | 10Β° β™Œ 44' | sun     |      ♉      |       8       |


# Quadrants (MiMi)

| quadrant   |  sum  | bodies                               |
|------------|-------|--------------------------------------|
| 1st β—΅      |   3   | saturn, uranus, pluto                |
| 2nd β—Ά      |   1   | neptune                              |
| 3rd β—·      |   2   | sun, mercury                         |
| 4th β—΄      |   5   | moon, venus, mars, jupiter, asc_node |


# Hemispheres (MiMi)

| hemisphere   |  sum  | bodies                                                      |
|--------------|-------|-------------------------------------------------------------|
| ←            |   8   | saturn, uranus, pluto, moon, venus, mars, jupiter, asc_node |
| β†’            |   3   | neptune, sun, mercury                                       |
| ↑            |   7   | sun, mercury, moon, venus, mars, jupiter, asc_node          |
| ↓            |   4   | saturn, uranus, pluto, neptune                              |


# Celestial Bodies of Transit in MiMi's chart

| Transit   | sign         |  house  | dignity   |
|-----------|--------------|---------|-----------|
| sun       | 10Β° β™‘ 16'   |    4    |           |
| moon      | 08Β° ♍ 42'   |   12    |           |
| mercury   | 22Β° ♐ 14' β„ž |    4    | detriment |
| venus     | 02Β° ♐ 53'   |    3    |           |
| mars      | 27Β° ♐ 28'   |    4    |           |
| jupiter   | 05Β° ♉ 34'   |    8    |           |
| saturn    | 03Β° β™“ 15'   |    6    |           |
| uranus    | 19Β° ♉ 22' β„ž |    9    |           |
| neptune   | 25Β° β™“ 04'   |    7    |           |
| pluto     | 29Β° β™‘ 21'   |    5    |           |
| asc_node  | 20Β° β™ˆ 51' β„ž |    8    |           |
| asc       | 14Β° ♉ 41'   |    9    |           |
| mc        | 02Β° β™’ 08'   |    5    |           |


# Aspects of Transit vs MiMi

| Transit   |  aspect  | MiMi     |  phase  | orb    |
|-----------|----------|----------|---------|--------|
| sun       |    ☍     | moon     |   β†’ ←   | 1Β° 47' |
| sun       |    β–‘     | mercury  |   β†’ ←   | 1Β° 48' |
| sun       |    β–³     | asc      |   ← β†’   | 0Β° 34' |
| moon      |    ⚹     | moon     |   β†’ ←   | 0Β° 13' |
| moon      |    ☌     | asc      |   β†’ ←   | 1Β° 00' |
| moon      |    β–‘     | mc       |   β†’ ←   | 0Β° 31' |
| mercury   |    β–‘     | saturn   |   β†’ ←   | 1Β° 11' |
| mercury   |    ☌     | neptune  |   ← β†’   | 0Β° 15' |
| mars      |    β–³     | mars     |   ← β†’   | 0Β° 29' |
| mars      |    β–³     | asc_node |   ← β†’   | 1Β° 25' |
| uranus    |    β–³     | saturn   |   β†’ ←   | 1Β° 41' |
| neptune   |    β–³     | uranus   |   ← β†’   | 0Β° 33' |
| pluto     |    β–‘     | sun      |   ← β†’   | 0Β° 58' |
| asc_node  |    β–³     | neptune  |   ← β†’   | 1Β° 37' |
| asc_node  |    ☍     | pluto    |   β†’ ←   | 0Β° 45' |
| mc        |    β–‘     | sun      |   β†’ ←   | 1Β° 49' |


# Aspect Cross Reference of Transit(cols) vs MiMi(rows)

|     |  β˜‰  |  ☽  |  ☿  |  ♀  |  β™‚  |  ♃  |  β™„  |  β™…  |  ♆  |  ♇  |  ☊  |  Asc  |  MC  |  sum  |
|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-------|------|-------|
|  β˜‰  |     |     |     |     |     |     |     |     |     |  β–‘  |     |       |  β–‘   |   2   |
|  ☽  |  ☍  |  ⚹  |     |     |     |     |     |     |     |     |     |       |      |   2   |
|  ☿  |  β–‘  |     |     |     |     |     |     |     |     |     |     |       |      |   1   |
|  ♀  |     |     |     |     |     |     |     |     |     |     |     |       |      |   0   |
|  β™‚  |     |     |     |     |  β–³  |     |     |     |     |     |     |       |      |   1   |
|  ♃  |     |     |     |     |     |     |     |     |     |     |     |       |      |   0   |
|  β™„  |     |     |  β–‘  |     |     |     |     |  β–³  |     |     |     |       |      |   2   |
|  β™…  |     |     |     |     |     |     |     |     |  β–³  |     |     |       |      |   1   |
|  ♆  |     |     |  ☌  |     |     |     |     |     |     |     |  β–³  |       |      |   2   |
|  ♇  |     |     |     |     |     |     |     |     |     |     |  ☍  |       |      |   1   |
|  ☊  |     |     |     |     |  β–³  |     |     |     |     |     |     |       |      |   1   |
| Asc |  β–³  |  ☌  |     |     |     |     |     |     |     |     |     |       |      |   2   |
| MC  |     |  β–‘  |     |     |     |     |     |     |     |     |     |       |      |   1   |

PDF Report

Configuration

  • create a Config object and assign it to Data object
  • it will override the default settings in config.py
  • a sample config as follow:
from natal.config import Display, Config, Orb

# adjust which celestial bodies to display
display = Display(
    mc = False,
    asc_node = False,
    chiron = True
)

# adjust orbs for each aspect
orb = Orb(
    conjunction = 8,
    opposition = 8,
    trine = 6,
    square = 6,
    sextile = 6
)

# the complete config object
config = Config(
    theme_type = "light", # or "dark", "mono"
    display = display,
    orb = orb
)

# create data object with the config
data = Data(
    name = "MiMi",
    city = "Taipei",
    dt = "1980-04-20 14:30",
    config = config,
)

read the docs for complete references

Tech Stack