Tôi biết đó là một chủ đề cũ, nhưng tôi đã hạ cánh ở đây nhiều lần thông qua Google và nghĩ rằng chưa có câu trả lời nào thực sự thỏa mãn. Hãy thử sử dụng một trong các chức năng sau:
Chỉnh sửa: Khi tôi nhận được một số lượt thích trên chủ đề cũ này, tôi cũng muốn chia sẻ một giải pháp được cập nhật (về cơ bản đặt hai chức năng trước đó của tôi lại với nhau và tự động quyết định liệu đó có phải là lô thanh hay hbar):: As I'm getting some likes on this old thread, I wanna share an updated solution as well (basically putting my two previous functions together and automatically deciding whether it's a bar or hbar plot):
def label_bars(ax, bars, text_format, **kwargs): """ Attaches a label on every bar of a regular or horizontal bar chart """ ys = [bar.get_y() for bar in bars] y_is_constant = all(y == ys[0] for y in ys) # -> regular bar chart, since all all bars start on the same y level (0) if y_is_constant: _label_bar(ax, bars, text_format, **kwargs) else: _label_barh(ax, bars, text_format, **kwargs) def _label_bar(ax, bars, text_format, **kwargs): """ Attach a text label to each bar displaying its y value """ max_y_value = ax.get_ylim()[1] inside_distance = max_y_value * 0.05 outside_distance = max_y_value * 0.01 for bar in bars: text = text_format.format(bar.get_height()) text_x = bar.get_x() + bar.get_width() / 2 is_inside = bar.get_height() >= max_y_value * 0.15 if is_inside: color = "white" text_y = bar.get_height() - inside_distance else: color = "black" text_y = bar.get_height() + outside_distance ax.text(text_x, text_y, text, ha='center', va='bottom', color=color, **kwargs) def _label_barh(ax, bars, text_format, **kwargs): """ Attach a text label to each bar displaying its y value Note: label always outside. otherwise it's too hard to control as numbers can be very long """ max_x_value = ax.get_xlim()[1] distance = max_x_value * 0.0025 for bar in bars: text = text_format.format(bar.get_width()) text_x = bar.get_width() + distance text_y = bar.get_y() + bar.get_height() / 2 ax.text(text_x, text_y, text, va='center', **kwargs)Bây giờ bạn có thể sử dụng chúng cho các lô thanh thông thường:
fig, ax = plt.subplots((5, 5)) bars = ax.bar(x_pos, values, width=0.5, align="center") value_format = "{:.1%}" # displaying values as percentage with one fractional digit label_bars(ax, bars, value_format)hoặc cho các lô thanh ngang:
fig, ax = plt.subplots((5, 5)) horizontal_bars = ax.barh(y_pos, values, width=0.5, align="center") value_format = "{:.1%}" # displaying values as percentage with one fractional digit label_bars(ax, horizontal_bars, value_format)Biểu đồ thanh hoặc biểu đồ thanh là biểu đồ hoặc biểu đồ trình bày dữ liệu phân loại với các thanh hình chữ nhật có chiều cao hoặc chiều dài tỷ lệ thuận với các giá trị mà chúng đại diện. Các thanh có thể được vẽ theo chiều dọc hoặc chiều ngang.
Một biểu đồ thanh hiển thị so sánh giữa các danh mục riêng biệt. Một trục của biểu đồ cho thấy các loại cụ thể được so sánh và trục khác đại diện cho giá trị đo được.
API Matplotlib cung cấp hàm thanh () có thể được sử dụng trong kiểu MATLAB sử dụng cũng như API hướng đối tượng. Chữ ký của hàm thanh () được sử dụng với đối tượng trục như sau -bar() function that can be used in the MATLAB style use as well as object oriented API. The signature of bar() function to be used with axes object is as follows −
ax.bar(x, height, width, bottom, align)Hàm tạo ra một biểu đồ thanh với hình chữ nhật ràng buộc có kích thước (x −width = 2; x + width = 2; dưới cùng + chiều cao).
Các tham số cho hàm là -
x | Trình tự vô hướng đại diện cho tọa độ X của các thanh. Căn chỉnh điều khiển nếu X là trung tâm thanh (mặc định) hoặc cạnh trái. |
Chiều cao | vô hướng hoặc chuỗi vô hướng biểu thị (các) chiều cao của các thanh. |
bề rộng | vô hướng hoặc giống như mảng, tùy chọn. chiều rộng của các thanh mặc định 0.8 |
đáy | vô hướng hoặc giống như mảng, tùy chọn. Các tọa độ y của các thanh mặc định không có. |
căn chỉnh | {‘Center,‘ Edge,}, tùy chọn, mặc định ‘trung tâm |
Hàm trả về một đối tượng container matplotlib với tất cả các thanh.
Sau đây là một ví dụ đơn giản về lô thanh matplotlib. Nó cho thấy số lượng sinh viên đăng ký cho các khóa học khác nhau được cung cấp tại một học viện.
import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_axes([0,0,1,1]) langs = ['C', 'C++', 'Java', 'Python', 'PHP'] students = [23,17,35,29,12] ax.bar(langs,students) plt.show()Khi so sánh một số đại lượng và khi thay đổi một biến, chúng ta có thể muốn một biểu đồ thanh nơi chúng ta có các thanh có một màu cho một giá trị số lượng.
Chúng ta có thể vẽ nhiều biểu đồ thanh bằng cách chơi với độ dày và vị trí của các thanh. Biến dữ liệu chứa ba loạt bốn giá trị. Kịch bản sau đây sẽ hiển thị ba biểu đồ thanh của bốn thanh. Các thanh sẽ có độ dày 0,25 đơn vị. Mỗi biểu đồ thanh sẽ được thay đổi 0,25 đơn vị từ số trước. Đối tượng dữ liệu là một đa số có chứa số lượng sinh viên được thông qua trong ba chi nhánh của một trường đại học kỹ thuật trong bốn năm qua.
import numpy as np import matplotlib.pyplot as plt data = [[30, 25, 50, 20], [40, 23, 51, 17], [35, 22, 45, 19]] X = np.arange(4) fig = plt.figure() ax = fig.add_axes([0,0,1,1]) ax.bar(X + 0.00, data[0], color = 'b', width = 0.25) ax.bar(X + 0.25, data[1], color = 'g', width = 0.25) ax.bar(X + 0.50, data[2], color = 'r', width = 0.25)Các bảng xếp hạng thanh xếp chồng xếp các thanh đại diện cho các nhóm khác nhau trên nhau. Chiều cao của thanh kết quả cho thấy kết quả kết hợp của các nhóm.
Tham số dưới cùng tùy chọn của hàm pyplot.bar () cho phép bạn chỉ định giá trị bắt đầu cho thanh. Thay vì chạy từ 0 đến một giá trị, nó sẽ đi từ dưới cùng đến giá trị. Cuộc gọi đầu tiên đến pyplot.bar () vẽ các thanh màu xanh. Cuộc gọi thứ hai đến pyplot.bar () vẽ các thanh màu đỏ, với phần dưới của các thanh màu xanh nằm trên đỉnh của các thanh màu đỏ.pyplot.bar() function allows you to specify a starting value for a bar. Instead of running from zero to a value, it will go from the bottom to the value. The first call to pyplot.bar() plots the blue bars. The second call to pyplot.bar() plots the red bars, with the bottom of the blue bars being at the top of the red bars.
import numpy as np import matplotlib.pyplot as plt N = 5 menMeans = (20, 35, 30, 35, 27) womenMeans = (25, 32, 34, 20, 25) ind = np.arange(N) # the x locations for the groups width = 0.35 fig = plt.figure() ax = fig.add_axes([0,0,1,1]) ax.bar(ind, menMeans, width, color='r') ax.bar(ind, womenMeans, width,bottom=menMeans, color='b') ax.set_ylabel('Scores') ax.set_title('Scores by group and gender') ax.set_xticks(ind, ('G1', 'G2', 'G3', 'G4', 'G5')) ax.set_yticks(np.arange(0, 81, 10)) ax.legend(labels=['Men', 'Women']) plt.show()