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()

