fantastic matplotlib Task03 打卡

  1. 理论树:子图–均匀子图和spec切片不规则子图。以及一点点子图上的方法(画线,网格)
  • 均匀子图的难点在于结合数据呈现的时候,for的构造和循环中i和j的确定。(以思考题第一题体现)

  • 不规则子图的难点则在于spec切片上的使用。(个人比较喜欢在spec中使用np.ones形成主图的网格切片,以思考题第二题为例)

  1. 题目
  • 练一练:做出类似的不规则饼图。

    利用极坐标加柱状图解答即可。(注意不是饼图)
r = np.arange(100, 600, 20)
theta = np.linspace(0, 2*np.pi, len(r), endpoint=False)

fig = plt.subplots(figsize=(8, 8))
ax = plt.subplot(111, polar=True)
ax.set_theta_direction(-1) #改为顺时针
ax.set_theta_zero_location('N') #从北(即90度)开始
plt.bar(theta, r, color=np.random.random((len(r), 3)), width=0.3) #color这个参数我也不太懂
plt.axis('off')
plt.tight_layout();


这里我也只能画个粗略出来。

import pandas as pd
data = pd.read_csv('layout_ex1.csv')
data

import matplotlib.pyplot as plt
%matplotlib inline
fig, ax = plt.subplots(2, 5, figsize=(16, 4), sharex=True, sharey=True)
fig.suptitle("Curve of Melbourne's temperature from 1981 to 1990", size=20)
for i in range(2):
    for j in range(5):
        ax[i][j].plot(range(1, 13), data.iloc[((i*5+j)*12):((i*5+j)*12+12), 1], '-o')
        ax[i][j].set_title(1981+i*5+j)
        ax[i][j].set_xticks(range(1, 13))
        ax[i][j].set_ylim((4, 19))
        if j == 0:
            ax[i][j].set_ylabel('temperature')
fig.tight_layout();


这题的关键在于:框架是教程中的for循环出子图,而且要把握住在运算中i是j的5倍和子图数据间隔为12这一点求出参数设置。

import numpy as np
data = np.random.randn(2, 150)

import matplotlib.pyplot as plt
%matplotlib inline
fig = plt.figure(figsize=(6, 6))
spec = fig.add_gridspec(nrows=10, ncols=10, width_ratios=np.ones(10), height_ratios=np.ones(10))

ax1 = fig.add_subplot(spec[2:10, 0:8])
ax1.scatter(data[0], data[1])
ax1.grid(True)
ax1.set_xlabel('my_data_x')
ax1.set_ylabel('my_data_y')

ax2 = fig.add_subplot(spec[0:2, 0:8], sharex=ax1)
ax2.hist(data[0], rwidth=0.9)
ax2.axis('off')
ax2.spines['top'].set_visible(False)
ax2.spines['bottom'].set_visible(False)
ax2.spines['right'].set_visible(False)
ax2.spines['left'].set_visible(False)

ax3 = fig.add_subplot(spec[2:10, 8:10], sharey=ax1)
ax3.hist(data[1], rwidth=0.9, orientation='horizontal')
ax3.axis('off')
ax3.spines['top'].set_visible(False)
ax3.spines['bottom'].set_visible(False)
ax3.spines['right'].set_visible(False)
ax3.spines['left'].set_visible(False)

plt.tight_layout();

image
本题关键在于:spec的设置以及一些子图的参数设置。ax2和ax3该关的都关了就行。我的spec思路是通过np.ones生成10x10的网格,然后ax1是2到10和0到8切,其他的类似推导解决就行。

浙ICP备19012682号