Matplotlib
Nó là một mô-đun vẽ được sử dụng rất phổ biến trong Python. MattPlotlib hỗ trợ vẽ đồ thị bằng ngôn ngữ mệnh lệnh tương tự như MATLAB, cũng như vẽ đồ thị bằng các phương thức gọi hướng đối tượng. Phương pháp vẽ của nó rất đơn giản và hoạt động tốt với các thư viện máy tính khoa học như numpy và gấu trúc, vì vậy nó được sử dụng rộng rãi. Tuy nhiên, trong quá trình sử dụng matplotlib, việc chèn phông chữ Trung Quốc và kiểm soát là một điều rắc rối hơn và đòi hỏi cấu hình đặc biệt để hiển thị đúng. Bài viết này chi tiết cách sử dụng tiếng Trung trong matplotlib.
Đầu tiên, hãy vẽ một sơ đồ đơn giản với đường cong hình sin và đường cong cosin:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import numpy as np import matplotlib.pyplot as plt x = np.linspace(-10, 10, 100) y = np.sin(x) z = np.cos(x) fig = plt.figure(figsize=(4, 3)) ax = fig.gca() ax.plot(x, y, label=’sin(x)’) ax.plot(x, z, label=’cos(x)’) ax.set_xlim((-10, 10)) ax.set_xlabel(‘x’) ax.set_ylabel(‘f(x)’) ax.legend() fig.tight_layout() fig.savefig(‘fig1.png’, dpi=150) |
Chạy chương trình và bạn sẽ thấy rằng một biểu đồ hình sin được tạo, như thể hiện trong hình sau.
Đoạn mã trên được vẽ bằng cách sử dụng cách tiếp cận hướng đối tượng. Tất nhiên, bạn cũng có thể sử dụng kiểu luồng lệnh của MATLAB để vẽ. Tôi sẽ không lặp lại nó ở đây.
Bây giờ không có tiếng Trung trong mã, mọi thứ đều bình thường. Nếu bạn sử dụng tiếng Trung trực tiếp, chúng ta hãy xem hiệu ứng
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import numpy as np import matplotlib.pyplot as plt x = np.linspace(-10, 10, 100) y = np.sin(x) z = np.cos(x) fig = plt.figure(figsize=(4, 3)) ax = fig.gca() ax.plot(x, y, label=’正弦曲线’) ax.plot(x, z, label=’余弦曲线’) ax.set_xlim((-10, 10)) ax.set_xlabel(‘相位角(rad)’) ax.set_ylabel(‘三角函数值’) ax.legend() fig.tight_layout() fig.savefig(‘fig2.png’, dpi=150) |
Hình ảnh kết quả được hiển thị trong hình dưới đây.
Văn bản bên trong không thể được hiển thị và một hộp được sử dụng để đại diện cho văn bản. Đồng thời, thông tin sau được xuất ra trong bảng điều khiển
1 2 3 | RuntimeWarning: Glyph 20313 missing from current font. font.set_text(s, 0, flags=flags) … |
Thông báo này có nghĩa là khi bạn gọi , bạn thấy rằng bạn không thể tìm thấy phông chữ cho từ tương ứng trong bộ phông chữ hiện tại.font.set_text
Vậy bộ phông chữ hiện đang được sử dụng là gì? Trong iPython, bạn có thể sử dụng lệnh sau để in cài đặt của matplotlib
1 2 | from matplotlib import rcParams print(rcParams) |
Như bạn có thể thấy từ đầu ra của bảng điều khiển, có một số mục bắt đầu bằng có liên quan đến phông chữ.font
font.family
Đề cập đến nhóm phông chữ được sử dụng. Mỗi nhóm phông chữ tương ứng với một loạt các phông chữ có chung đặc điểm. Có ba nhóm phông chữ thường được sử dụng, đó là phông chữ serif, một nhóm khác là sans-serif, là sans-serif và nhóm cuối cùng là phông chữ cách đều nhau. Các kịch bản áp dụng của ba phông chữ sẽ không được lặp lại ở đây. Phông chữ mặc định là sans-serif, phù hợp với đầu vào trên màn hình. Đối với giấy in, phông chữ serif thường được sử dụng.serif
sans-serif
monospace
Đối với mỗi nhóm phông chữ, có một danh sách phông chữ tương ứng. Ví dụ: trong MacBook của tôi, danh sách phông chữ cho phông chữ serif được xác định như thế này
1 2 3 4 | font.serif: [‘DejaVu Serif’, ‘Bitstream Vera Serif’, ‘Computer Modern Roman’, ‘New Century Schoolbook’, ‘Century Schoolbook L’, ‘Utopia’, ‘ITC Bookman’, ‘Bookman’, ‘Nimbus Roman No9 L’, ‘Times New Roman’, ‘Times’, ‘Palatino’, ‘Charter’, ‘serif’] |
Người đọc quen thuộc với lập trình HTML sẽ quen thuộc với danh sách này. Trong HTML, có một cơ chế dự phòng phông chữ trong đó trình duyệt trước tiên cố gắng hiển thị văn bản với phông chữ đầu tiên trong danh sách phông chữ. Nếu không có văn bản tương ứng trong tệp phông chữ đầu tiên, nó sẽ dự phòng cho phông chữ tiếp theo và tìm lại. Đây cũng là lý do tại sao, trong trình duyệt, khi sử dụng phông chữ đặc biệt, một số ký tự mới vẫn có thể được hiển thị, nhưng phông chữ khác nhau. Tuy nhiên, điều quan trọng cần lưu ý là không có cơ chế dự phòng tương tự trong matplotlib. Mặc dù một danh sách các phông chữ cũng được sử dụng, matplotlib sử dụng một cơ chế tra cứu phông chữ trong hệ thống bắt đầu từ mục đầu tiên trong danh sách và nếu nó tồn tại, nó sẽ hiển thị với phông chữ đó mà không sử dụng bất kỳ phông chữ nào tiếp theo. Chỉ khi phông chữ không tồn tại trong hệ thống, nó sẽ nhìn ngược dọc theo danh sách các phông chữ có sẵn. Do đó, bạn không thể sử dụng khả năng hiển thị phông chữ Trung Quốc và phương Tây riêng biệt như Word hoặc khả năng tìm nhiều phông chữ trong HTML.
Cuộc thảo luận trên cho thấy rằng không thể thêm hỗ trợ của Trung Quốc bằng cách thêm phông chữ vào cuối danh sách phông chữ. Vậy làm thế nào để bạn giải quyết vấn đề này?
Đầu tiên, chúng tôi cố gắng sử dụng phông chữ Trung Quốc trực tiếp. Điều đầu tiên cần làm là quyết định sử dụng phông chữ nào. Nếu bạn đang sử dụng MacBook, bạn có thể tìm thấy tên tiếng Anh của phông chữ Trung Quốc mà bạn có thể sử dụng trong Danh sách phông chữ > khác trên Launchpad. Trên máy tính của tôi, tên phông chữ cho Songti là “Simsun (người sáng lập mở rộng)”. Trong Windows, bạn cũng có thể tìm thấy Songti từ “Cài đặt phông chữ”, nhấp vào nó và từ siêu dữ liệu, bạn có thể thấy tên tệp phông chữ của nó là “SIMSUN. TTC”, tức là tên phông chữ là “SIMSUN”. Sau đó, bạn có thể chuyển tên phông chữ cho matplotlib. Tạo các tài liệu sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import numpy as np import matplotlib.pyplot as plt from matplotlib import rcParams rcParams[‘font.family’] = ‘serif’ rcParams[‘font.serif’] = ‘Simsun (founder extended)’ x = np.linspace(-10, 10, 100) y = np.sin(x) z = np.cos(x) fig = plt.figure(figsize=(4, 3)) ax = fig.gca() ax.plot(x, y, label=’正弦曲线’) ax.plot(x, z, label=’余弦曲线’) ax.set_xlim((-10, 10)) ax.set_xlabel(‘相位角(rad)’) ax.set_ylabel(‘三角函数值’) ax.legend() fig.tight_layout() fig.savefig(‘fig3.png’, dpi=150) |
Có thể thấy rằng các ký tự Trung Quốc có thể được hiển thị bình thường. Tuy nhiên, có một vấn đề là phông chữ tiếng Anh và chữ số trong hình cũng sử dụng kiểu bài hát. Tiếng Anh và chữ số của phong cách nhà Tống tương đối xấu, và trong văn học khoa học, chúng thường không được sử dụng, mà thay vào đó sử dụng phông chữ “Times New Roman”. Có một vấn đề ở đây, hiện tại không có cách nào để sử dụng hai phông chữ cùng một lúc trong matplotlib, vì vậy chỉ có một cách rắc rối hơn để “cứu đất nước bằng đường cong”.
Một cách để giải quyết vấn đề là sử dụng phông chữ Trung Quốc trông đẹp hơn bằng tiếng Anh, chẳng hạn như Bài hát tiếng Trung “STSONG”, Bài hát Adobe “ADOBESONGSTD”, v.v. Tuy nhiên, những phông chữ này có phần khác biệt so với phong cách Tống truyền thống và Times New Roman. Nếu bạn có yêu cầu phông chữ nghiêm ngặt, nó sẽ không hoạt động.
Một giải pháp khác là sử dụng phông chữ tiếng Anh “Times New Roman” trên toàn cầu và sử dụng phông chữ Trung Quốc tạm thời nơi tiếng Trung xuất hiện. Nhưng đối với tiếng Trung và tiếng Anh hỗn hợp, sử dụng phông chữ Trung Quốc tạm thời không giúp ích gì. Trong trường hợp này, bạn cần sử dụng trình kết xuất LaTeX để sử dụng phông chữ “stix” trong phông chữ toán học để hoàn thành việc trộn. Nó có sự tương đồng rất cao với “Times New Roman” và có thể có tác dụng “nhầm lẫn giữa thật với giả”.
Sau đây là mã để trộn tiếng Trung và tiếng Anh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import numpy as np import matplotlib.pyplot as plt from matplotlib import rcParams rcParams[‘font.family’] = ‘serif’ rcParams[‘font.serif’] = ‘Times New Roman’ rcParams[‘mathtext.fontset’] = ‘stix’ ch_font = ‘Simsun (founder extended)’ x = np.linspace(-10, 10, 100) y = np.sin(x) z = np.cos(x) fig = plt.figure(figsize=(4, 3)) ax = fig.gca() ax.plot(x, y, label=’正弦曲线’) ax.plot(x, z, label=’余弦曲线’) ax.set_xlim((-10, 10)) ax.set_xlabel(‘相位角($\mathrm{rad}$)’, fontname=ch_font) ax.set_ylabel(‘三角函数值’, fontname=ch_font) lbs = ax.legend().get_texts() for lb in lbs: lb.set_fontproperties(ch_font) ax.set_title(‘使用中文和 $\mathrm{English}$’, fontname=ch_font) ax.annotate(‘最大值为 $\mathrm{1}$’, xy=(3.1416 / 2, 1), xytext=(-20, -30), textcoords=”offset points”, arrowprops={‘arrowstyle’: ‘->’}, fontname=ch_font) fig.tight_layout() fig.savefig(‘fig4.png’, dpi=150) |
Trong đoạn mã trên, đặt phông chữ toàn cục thành “Times New Roman” và phông chữ toán học thành “stix”. Sau đó chỉ định phông chữ Trung Quốc để sử dụng là “Simsun (người sáng lập mở rộng)” . Phông chữ này được sử dụng bởi người dùng MacBook. Đối với người dùng Windows, hãy thay đổi nó thành “SIMSUN”. Sau đó, khi vẽ phông chữ, hãy đặt phông chữ tạm thời cho phần có tiếng Trung. Khi bạn gọi Set Axes, hãy truyền tham số để đặt phông chữ của nó. Đối với phần “rad”, sử dụng biểu thức LaTeX để bọc phần tiếng Anh (tức là thêm dấu trước và sau nó). Vì phông chữ render mặc định trong LaTeX là in nghiêng, bạn cần sử dụng các lệnh để làm cho các ký tự đều đặn.ch_font
set_xlabel
fontname=
$
\mathrm{}
Khi bạn thêm chú giải, phương pháp trả về đối tượng chú giải thay vì văn bản. Chúng tôi sử dụng phương pháp của nó để có được một danh sách tất cả các từ được sử dụng trong truyền thuyết. Sau đó lặp qua danh sách và sử dụng phương pháp để đặt phông chữ của nó.legend()
get_texts
set_fontproperties
Đối với các hoạt động văn bản khác, hầu hết chúng đều có các hoạt động liên quan đến và , về cơ bản có thể được giải quyết theo cách tương tự. Bạn có thể tham khảo tài liệu cho matplotlib. Dưới đây là ví dụ về việc sử dụng Thêm tiêu đề và một ví dụ sử dụng Thêm nhận xét.fontnamefontpropertiesset_titleannotate
# Danh sách các từ tiếng Trung
words = ["结果", "豪华"]
# Tạo đồ thị
G = nx.Graph()
# Thêm các nút (nodes) vào đồ thị
G.add_nodes_from(words)
# Thêm cạnh (edges) vào đồ thị nếu giữa hai từ có ít nhất một từ giống nhau
for i in range(len(words)):
for j in range(i+1, len(words)):
word1 = words[i]
word2 = words[j]
if any(char in word2 for char in word1):
G.add_edge(word1, word2)
# Vẽ đồ thị
pos = nx.spring_layout(G) # Phân bố nút
nx.draw(G, pos, with_labels=True, node_size=2000, node_color="skyblue", font_size=10, font_weight="bold")
plt.title("Đồ thị từ tiếng Trung")
plt.show()
Điều đáng nói là phong cách trong MacBook cũng khác với kiểu trong Windows. Do đó, phông chữ Song trong hình ảnh này trông cũng hơi lạ. Nếu bạn đang sử dụng thiết bị Windows, nó hoàn toàn giống với thông thường.
Trên đây là phương pháp sử dụng trộn tiếng Trung và tiếng Anh trong matplotlib. Hy vọng rằng, trong các phiên bản matplotlib trong tương lai, cơ chế dự phòng cho phông chữ cũng có thể được giới thiệu, để việc cài đặt phông chữ sẽ không quá cồng kềnh.