Thêm nhãn x và y vào lô gấu trúc


195

Giả sử tôi có đoạn mã sau đây vẽ đồ thị rất đơn giản bằng cách sử dụng gấu trúc:

import pandas as pd
values = [[1, 2], [2, 5]]
df2 = pd.DataFrame(values, columns=['Type A', 'Type B'], 
                   index=['Index 1', 'Index 2'])
df2.plot(lw=2, colormap='jet', marker='.', markersize=10, 
         title='Video streaming dropout by category')

Đầu ra

Làm cách nào để tôi dễ dàng đặt nhãn x và y trong khi duy trì khả năng sử dụng các bản đồ màu cụ thể? Tôi nhận thấy rằng plot()trình bao bọc cho gấu trúc DataFrames không có bất kỳ tham số cụ thể nào cho việc đó.

Câu trả lời:


327

Các df.plot()chức năng trả về một matplotlib.axes.AxesSubplotđối tượng. Bạn có thể đặt nhãn trên đối tượng đó.

ax = df2.plot(lw=2, colormap='jet', marker='.', markersize=10, title='Video streaming dropout by category')
ax.set_xlabel("x label")
ax.set_ylabel("y label")

nhập mô tả hình ảnh ở đây

Hoặc, ngắn gọn hơn : ax.set(xlabel="x label", ylabel="y label").

Ngoài ra, nhãn trục x chỉ mục được tự động đặt thành tên Chỉ mục, nếu có. vì vậy df2.index.name = 'x label'cũng sẽ làm việc


71
Có một lý do cụ thể tại sao các nhãn x và y không thể được thêm làm đối số pd.plot()không? Căn cứ vào tính súc tích thêm pd.plot()trên plt.plot()có vẻ như nó sẽ làm cho tinh thần để làm cho nó thậm chí nhiều hơn gọn gàng thay vì phải gọi ax.set_ylabel().
Chrispy

Khi tôi đã làm ax.set_ylabel("y label"), nó trả về một lỗi 'list' object is not callable. Bất kỳ ý tưởng?
Sổ cái Yu

Hấp dẫn. Tôi không biết nếu nó phụ thuộc vào phiên bản nhưng tôi sẽ phải làm ax.axes.set_ylabel("y label").
Sổ cái Yu

2
Tôi nghĩ rằng bạn có thể đặt ax.set(xlabel='...)cao hơn trong câu trả lời này vì nó có thể bị bỏ qua qua biểu đồ. Nó thực sự là cách tiếp cận cô đọng nhất để đặt cả hai trục, đó là usecase chung.
poulter7

Làm thế nào để bạn thiết lập vị trí?
Odisseo

43

Bạn có thể sử dụng làm như thế này:

import matplotlib.pyplot as plt 
import pandas as pd

plt.figure()
values = [[1, 2], [2, 5]]
df2 = pd.DataFrame(values, columns=['Type A', 'Type B'], 
                   index=['Index 1', 'Index 2'])
df2.plot(lw=2, colormap='jet', marker='.', markersize=10,
         title='Video streaming dropout by category')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
plt.show()

Rõ ràng là bạn phải thay thế các chuỗi 'xlabel' và 'ylabel' bằng những gì bạn muốn chúng trở thành.


Cũng lưu ý, bạn phải gọi plt.xlabel()vv sau đó df.plot(), không phải trước đó, vì nếu không, bạn nhận được hai lô - các cuộc gọi sẽ sửa đổi một âm mưu "trước đó". Điều tương tự cũng diễn ra plt.title().
Tomasz Gandor

30

Nếu bạn gắn nhãn các cột và chỉ mục của DataFrame của mình, gấu trúc sẽ tự động cung cấp các nhãn phù hợp:

import pandas as pd
values = [[1, 2], [2, 5]]
df = pd.DataFrame(values, columns=['Type A', 'Type B'], 
                  index=['Index 1', 'Index 2'])
df.columns.name = 'Type'
df.index.name = 'Index'
df.plot(lw=2, colormap='jet', marker='.', markersize=10, 
        title='Video streaming dropout by category')

nhập mô tả hình ảnh ở đây

Trong trường hợp này, bạn vẫn sẽ cần cung cấp nhãn y theo cách thủ công (ví dụ: thông qua plt.ylabelnhư được hiển thị trong các câu trả lời khác).


hiện tại, 'cung cấp tự động từ DataFrame' không hoạt động. Tôi vừa thử nó (phiên bản gấu trúc 0.16.0, matplotlib 1.4.3) và cốt truyện tạo ra chính xác, nhưng không có nhãn trên các trục.
szeitlin

1
@szeitlin bạn có thể vui lòng nộp báo cáo lỗi trên trang github của gấu trúc không? github.com/pydata/pandas/issues
shoyer

bạn biết những gì, ngày nay ít nhất xlabel đang hoạt động. có lẽ có điều gì đó kỳ lạ về khung dữ liệu tôi đã sử dụng ngày hôm qua (?). nếu tôi có thể sao chép nó, tôi sẽ nộp nó!
szeitlin

20

Có thể đặt cả hai nhãn cùng với axis.setchức năng. Tìm ví dụ:

import pandas as pd
import matplotlib.pyplot as plt
values = [[1,2], [2,5]]
df2 = pd.DataFrame(values, columns=['Type A', 'Type B'], index=['Index 1','Index 2'])
ax = df2.plot(lw=2,colormap='jet',marker='.',markersize=10,title='Video streaming dropout by category')
# set labels for both axes
ax.set(xlabel='x axis', ylabel='y axis')
plt.show()

nhập mô tả hình ảnh ở đây


3
Tôi thích .set(xlabel='x axis', ylabel='y axis')giải pháp này vì nó cho phép tôi đặt tất cả trong một dòng, không giống như các phương thức cốt truyện set_xlabel và set_ylabel. Tôi tự hỏi tại sao tất cả chúng (bao gồm cả phương thức thiết lập, nhân tiện) không trả về đối tượng cốt truyện hoặc ít nhất một cái gì đó được thừa hưởng từ nó.
chịu lỗi

14

Đối với trường hợp bạn sử dụng pandas.DataFrame.hist:

plt = df.Column_A.hist(bins=10)

Lưu ý rằng bạn nhận được một ARRAY của các ô, thay vì một âm mưu. Do đó, để đặt nhãn x, bạn sẽ cần phải làm một cái gì đó như thế này

plt[0][0].set_xlabel("column A")

10

Thế còn ...

import pandas as pd
import matplotlib.pyplot as plt

values = [[1,2], [2,5]]

df2 = pd.DataFrame(values, columns=['Type A', 'Type B'], index=['Index 1','Index 2'])

(df2.plot(lw=2,
          colormap='jet',
          marker='.',
          markersize=10,
          title='Video streaming dropout by category')
    .set(xlabel='x axis',
         ylabel='y axis'))

plt.show()

2

pandassử dụng matplotlibcho các ô dữ liệu cơ bản. Vì vậy, nếu bạn đang sử dụng pandascho cốt truyện cơ bản, bạn có thể sử dụng matplotlib để tùy chỉnh cốt truyện. Tuy nhiên, tôi đề xuất một phương pháp thay thế ở đây bằng cách sử dụng seaborncho phép tùy biến cốt truyện nhiều hơn trong khi không đi vào cấp độ cơ bản matplotlib.

Mã làm việc:

import pandas as pd
import seaborn as sns
values = [[1, 2], [2, 5]]
df2 = pd.DataFrame(values, columns=['Type A', 'Type B'], 
                   index=['Index 1', 'Index 2'])
ax= sns.lineplot(data=df2, markers= True)
ax.set(xlabel='xlabel', ylabel='ylabel', title='Video streaming dropout by category') 

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.