I asked ChatGPT to generate a sample list of Tang Dynasty Poets from the book of 300 poems.

It gave me this – it had some duplicates and one Song Dynasty poet in it.

import pandas as pd

data = [
    {"English Name": "Li Bai", "Chinese Name": "李白", "Dates": "701-762"},
    {"English Name": "Du Fu", "Chinese Name": "杜甫", "Dates": "712-770"},
    {"English Name": "Wang Wei", "Chinese Name": "王维", "Dates": "699-759"},
    {"English Name": "Li Shangyin", "Chinese Name": "李商隐", "Dates": "813-858"},
    {"English Name": "Bai Juyi", "Chinese Name": "白居易", "Dates": "772-846"},
    {"English Name": "Han Yu", "Chinese Name": "韩愈", "Dates": "768-824"},
    {"English Name": "Meng Haoran", "Chinese Name": "孟浩然", "Dates": "689-740"},
    {"English Name": "Li He", "Chinese Name": "李贺", "Dates": "790-816"},
    {"English Name": "Li Yu", "Chinese Name": "李煜", "Dates": "937-978"},
    {"English Name": "Li Qingzhao", "Chinese Name": "李清照", "Dates": "1084-1151"},
    {"English Name": "Liu Zongyuan", "Chinese Name": "柳宗元", "Dates": "773-819"},
    {"English Name": "Wei Yingwu", "Chinese Name": "韦应物", "Dates": "737-792"},
    {"English Name": "Wang Changling", "Chinese Name": "王昌龄", "Dates": "698-757"},
    {"English Name": "Cui Hao", "Chinese Name": "崔颢", "Dates": "704-754"},
    {"English Name": "Du Mu", "Chinese Name": "杜牧", "Dates": "803-852"},
    {"English Name": "Meng Jiao", "Chinese Name": "孟郊", "Dates": "751-814"},
    {"English Name": "Yuan Zhen", "Chinese Name": "元稹", "Dates": "779-831"},
    {"English Name": "Zhang Jiuling", "Chinese Name": "张九龄", "Dates": "678-740"},
    {"English Name": "Meng Haoran", "Chinese Name": "孟浩然", "Dates": "689-740"},
    {"English Name": "Wei Yingwu", "Chinese Name": "韦应物", "Dates": "737-792"}
]

df = pd.DataFrame(data)
print(df)

I cleaned it up and ask it to give me plot of the ages – so I can see how lives overlapped

 

import pandas as pd
import matplotlib.pyplot as plt

data = [
    {"English Name": "Li Bai", "Chinese Name": "李白", "Dates": "701-762"},
    {"English Name": "Du Fu", "Chinese Name": "杜甫", "Dates": "712-770"},
    {"English Name": "Wang Wei", "Chinese Name": "王维", "Dates": "699-759"},
    {"English Name": "Li Shangyin", "Chinese Name": "李商隐", "Dates": "813-858"},
    {"English Name": "Bai Juyi", "Chinese Name": "白居易", "Dates": "772-846"},
    {"English Name": "Han Yu", "Chinese Name": "韩愈", "Dates": "768-824"},
    {"English Name": "Meng Haoran", "Chinese Name": "孟浩然", "Dates": "689-740"},
    {"English Name": "Li He", "Chinese Name": "李贺", "Dates": "790-816"},
    {"English Name": "Li Yu", "Chinese Name": "李煜", "Dates": "937-978"},
    {"English Name": "Liu Zongyuan", "Chinese Name": "柳宗元", "Dates": "773-819"},
    {"English Name": "Wei Yingwu", "Chinese Name": "韦应物", "Dates": "737-792"},
    {"English Name": "Wang Changling", "Chinese Name": "王昌龄", "Dates": "698-757"},
    {"English Name": "Cui Hao", "Chinese Name": "崔颢", "Dates": "704-754"},
    {"English Name": "Du Mu", "Chinese Name": "杜牧", "Dates": "803-852"},
    {"English Name": "Meng Jiao", "Chinese Name": "孟郊", "Dates": "751-814"},
    {"English Name": "Yuan Zhen", "Chinese Name": "元稹", "Dates": "779-831"},
    {"English Name": "Zhang Jiuling", "Chinese Name": "张九龄", "Dates": "678-740"}
]

df = pd.DataFrame(data)
df[['Start', 'End']] = df['Dates'].str.split('-', expand=True).astype(int)

# Sorting by start date
df = df.sort_values(by='Start')

# Creating the chart
fig, ax = plt.subplots()
for i, row in df.iterrows():
    ax.plot([row['Start'], row['End']], [i, i], linewidth=3, color='blue')
    ax.scatter(row['Start'], i, color='red', marker='o', s=50)
    ax.scatter(row['End'], i, color='green', marker='o', s=50)
    ax.text(row['Start'], i-0.2, row['English Name'], ha='right')
    ax.text(row['End'], i-0.2, row['Chinese Name'], ha='left')

# Setting chart labels and title
ax.set_yticks(range(len(df)))
ax.set_yticklabels([])
ax.set_xlabel('Year')
ax.set_title('Tang Dynasty Poets - Lifespan Overlap')

plt.show()

It gave me an error on the Chinese charters.   So, I searched and found that I can load a font

And specify the fontproperties for the label you have issue with.

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

data = [
    {"English Name": "Li Bai", "Chinese Name": "李白", "Dates": "701-762"},
    {"English Name": "Du Fu", "Chinese Name": "杜甫", "Dates": "712-770"},
    {"English Name": "Wang Wei", "Chinese Name": "王维", "Dates": "699-759"},
    {"English Name": "Li Shangyin", "Chinese Name": "李商隐", "Dates": "813-858"},
    {"English Name": "Bai Juyi", "Chinese Name": "白居易", "Dates": "772-846"},
    {"English Name": "Han Yu", "Chinese Name": "韩愈", "Dates": "768-824"},
    {"English Name": "Meng Haoran", "Chinese Name": "孟浩然", "Dates": "689-740"},
    {"English Name": "Li He", "Chinese Name": "李贺", "Dates": "790-816"},
    {"English Name": "Li Yu", "Chinese Name": "李煜", "Dates": "937-978"},
    {"English Name": "Liu Zongyuan", "Chinese Name": "柳宗元", "Dates": "773-819"},
    {"English Name": "Wei Yingwu", "Chinese Name": "韦应物", "Dates": "737-792"},
    {"English Name": "Wang Changling", "Chinese Name": "王昌龄", "Dates": "698-757"},
    {"English Name": "Cui Hao", "Chinese Name": "崔颢", "Dates": "704-754"},
    {"English Name": "Du Mu", "Chinese Name": "杜牧", "Dates": "803-852"},
    {"English Name": "Meng Jiao", "Chinese Name": "孟郊", "Dates": "751-814"},
    {"English Name": "Yuan Zhen", "Chinese Name": "元稹", "Dates": "779-831"},
    {"English Name": "Zhang Jiuling", "Chinese Name": "张九龄", "Dates": "678-740"}
]

df = pd.DataFrame(data)

font = fm.FontProperties(fname=r"C:\windows\fonts\simsun.ttc")


df[['Start', 'End']] = df['Dates'].str.split('-', expand=True).astype(int)

# Sorting by start date
df = df.sort_values(by='Start')

# Creating the chart
fig, ax = plt.subplots(figsize=(12, 8))
for i, row in df.iterrows():
    ax.plot([row['Start'], row['End']], [i, i], linewidth=3, color='blue')
    ax.scatter(row['Start'], i, color='red', marker='o', s=50)
    ax.scatter(row['End'], i, color='green', marker='o', s=50)
    ax.text(row['Start'], i-0.2, row['English Name'], ha='right')
    ax.text(row['End'], i-0.2, row['Chinese Name'], ha='left', fontproperties=font)

# Setting chart labels and title
ax.set_yticks(range(len(df)))
ax.set_yticklabels([])
ax.set_xlabel('Year')
ax.set_title('Tang Dynasty Poets - Lifespan Overlap')

plt.show()

Leave a Reply