Python snippet: Visualizing

matplotlib

Python snippet là series các bài viết tổng hợp lại những đoạn code hữu ích trong quá trình làm việc và nghiên cứu của tôi. Mục đích chủ yếu làm nơi tham khảo nhanh để tiết kiệm thời gian cài đặt và triển khai. Tôi sẽ bắt đầu với visualizing gồm các chart (biểu đồ) cơ bản thường hay dùng để phân tích dữ liệu.

Source code: data-science-works
Thư viện: matplotlib, numpy


Line chart

Đầu vào: dữ liệu trục hoành (số năm), dữ liệu trục tung (GDP).

Tuỳ chỉnh:

  • Màu sắc, marker, linestyle.
  • Tiêu đề.
  • x,y label.

Dữ liệu Vietnam GDP lấy từ
http://data.worldbank.org/country/vietnam

vietnam-gdp

years = ["1985", "1986", "1987", "1988", "1989", "1990", "1991", "1992", "1993", "1994", "1995", "1996", "1997",
             "1998", "1999", "2000", "2001", "2002", "2003", "2004", "2005", "2006", "2007", "2008", "2009", "2010",
             "2011", "2012", "2013", "2014", "2015"]
gdp = [14094688429, 26336617862, 36658108169, 25423812494, 6293304847, 6471740486,
       9613369553, 9866990096, 13180954014, 16286434094, 20736163915, 24657470331,
       26843701136, 27209601995, 28683658004, 33640085727, 35291349277, 37947904054,
       42717072777, 49424107709, 57633255739, 66371664817, 77414425532, 99130304099,
       106014600963, 115931749904, 135539487317, 155820001920, 171222025117, 186204652922,
       193599379094]

# create a line chart, years on x-axis, gdp on y-axis
plt.plot(years, gdp, color='#f39c12', marker='o', linestyle='solid')

# add a title
plt.title("Vietnam GDP")

# add a label to the y-axis
plt.ylabel("Billions of $")
plt.show()

Bar chart

Đầu vào: dữ liệu trục hoành (bảng màu), dữ liệu trục tung (mức độ yêu thích).

Bảng màu flat UI: https://flatuicolors.com/

my-favorite-colors

color_names = ["Emerald", "Green Sea", "Midnight Blue", "Carrot", "Peter River"]
colors = ["#2ecc71", "#16a085", "#2c3e50", "#e67e22", "#3498db"]
num_favorite = [5, 11, 3, 8, 10]

# bars are by default width 0.8, so we'll add 0.1 to the left coordinates
# so that each bar is centered
xs = [i + 0.1 for i, _ in enumerate(color_names)]

# plot bars with left x-coordinates [xs], heights [num_favorite]
plt.bar(xs, num_favorite, color=colors)
plt.title("My Favorite Colors")

# label x-axis with color names at bar centers
plt.xticks([i + 0.5 for i, _ in enumerate(color_names)], color_names)

plt.show()

Histogram

Đầu vào: dữ liệu trục hoành (số điểm thi), dữ liệu trục tung (số học sinh có cùng điểm thi).

results-of-the-exam

data = []
for i in range(100):
    data.append(np.random.randint(1, 11))

plt.hist(data, bins=10, facecolor='#bdc3c7')

plt.xlabel("Points")
plt.ylabel("# of Students")
plt.title("Results of the exam")
plt.show()

Multiple line chart

Đầu vào: dữ liệu trục hoành (số năm), dữ liệu trục tung (số lượng động vật: gấu, cá heo, cá voi).

number-of-animals-each-year

bears = [10, 58, 85, 115, 139, 182]
dolphins = [150, 75, 32, 14, 8, 5]
whales = [80, 50, 100, 75, 90, 70]
x = [0, 1, 2, 3, 4, 5]
years = ["2009", "2010", "2011", "2012", "2013", "2014"]

# we can make multiple calls to plt.plot
# to show multiple series on the same chart
plt.plot(x, bears, '#16a085', marker='o', linewidth=3.0, label='Bears')
plt.plot(x, dolphins, '#c0392b', marker='s', linewidth=3.0, label='Dolphins')
plt.plot(x, whales, '#3498db', marker='^', linewidth=3.0, label='Whales')

# because we've assigned labels to each series
# we can get a legend for free
# loc=9 means "top center"
plt.legend(loc=9)
plt.title("Number of animals each year")
plt.xlabel("Years")
plt.xticks(x, years)
plt.show()

Scatter plot

Đầu vào: dữ liệu trục hoành (diện tích theo mét vuông), dữ liệu trục tung (giá tính theo nghìn $).

house-prices

sizes = [700, 650, 720, 630, 710, 640, 600, 640, 670]
prices = [175, 170, 205, 120, 220, 130, 105, 145, 190]
labels = ["$175", "$170", "$205", "$120", "$220", "$130", "$105", "$145", "$190"]

plt.scatter(sizes, prices, marker='s', s=40, color='#2ecc71')

# label each point
for label, friend_count, minute_count in zip(labels, sizes, prices):
    plt.annotate(label,
                 xy=(friend_count, minute_count),  # put the label with its point
                 xytext=(5, -5),  # but slightly offset
                 textcoords='offset points')

plt.title("House prices")
plt.xlabel("Size in m2")
plt.ylabel("Thousand $")
plt.show()

Pie chart

Đầu vào: tên các hãng smartphone, tỉ lệ phần trăm phân bố thị trường.

Tuỳ chỉnh:

  • Khoảng cách số phần trăm hướng ra ngoài (pctdistance).
  • Khoảng cách nhãn hướng ra ngoài (labeldistance).
  • Gốc bắt đầu pie chart quay.

smartphones-market

data = [0.5, 0.26, 0.11, 0.04, 0.02, 0.02, 0.01, 0.04]
smart_phone = ["Apple", "Samsung", "LG", "Motorola", "HTC", "Nokia", "Amazon", "Other"]
colors = ["#ecf0f1", "#3498db", "#e67e22", "#1abc9c", "#bdc3c7", "#8e44ad", "#f39c12", "#2c3e50"]

plt.pie(data, labels=smart_phone, colors=colors, autopct='%1.1f%%', startangle=-90, pctdistance=0.9, labeldistance=1.2)

# make sure pie is a circle and not an oval
plt.axis("equal")
plt.show()
Advertisements

3 thoughts on “Python snippet: Visualizing

  1. Hi a, e có 2 câu hỏi về vấn đề data visualizing:
    1. Đối với các dữ liệu complex vừa số vừa chữ thì mình có những phương pháp nào để visualize a nhỉ?
    2. Đối với 1 lượng lớn dữ liệu thuộc dạng high dimensional thì có các công cụ và kĩ thuật phổ biến nào để visualize?

    Like

    • Hi e, câu hỏi 1 và 2 tương tự nhau. Do bị giới hạn về không gian biểu diễn, ta chỉ có thể biểu diễn tối đa 3 chiều dữ liệu. Để có thể nâng số chiều lên, ta có thể vận dụng hai cách sau:
      1) mutual pairwise relationship. Kết hợp từng thuộc tính lại với nhau để tạo ra các biểu đồ tương ứng.
      2) sử dụng màu sắc, kích thước, hình dáng, … để phân biệt. Mỗi yếu tố tương đương với một chiều mới.
      Xem thêm: https://ongxuanhong.wordpress.com/2015/09/16/exploratory-data-analysis-cac-nguyen-tac-trinh-bay-bieu-do/

      Like

      • Trong vấn đề 1) e hỏi thì e đang thắc mắc ở chỗ: đối với các đồ thị thông thường, dữ liệu số sẽ chuyển thành toạ độ trong không gian, nên nếu là chữ thì mình nên làm thế nào.

        Ngoài ra, theo e biết ý tưởng chính của việc biểu diễn dữ liệu nhiều chiều là đưa về 2-3 chiều. Có 2 phương pháp truyền thống, hoặc là dùng các phép chiếu hình học theo 1 hàm hợp lý để giảm chiều, 2 là dùng các hình 2D với nhiều nét để biểu diễn số chiều. E đang tìm hiểu topological data analysis để tìm cách biểu diễn hiệu quả hơn. Trong python có thư viện mapper, nó implement thuật toán Mapper được tạo ra bởi Gurjeet Singh, Facundo Mémoli và Gunnar Carlsson, cũng là các founder của https://www.ayasdi.com/ tiên phong trong lĩnh vực TDA. A có kinh nghiệm nào về thư viện đó nói riêng hoặc việc sử dụng TDA nói chung để phân tích và biễu diễn dữ liệu thì cho e tham khảo với ạ!

        Thanks a nhiều :D!

        Like

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s