matplotlib 画图总结

1. 图片基本设置

import matplotlib.pyplot as plt

# 图片尺寸
plt.figure(width, height) # 方式1
plt.rcParams['figure.figuresize'] = (width, height) # 方式2

# 坐标轴
plt.xlabel('labelname', fontsize=10)
## 第一个列表是刻度的位置, 第二个列表是刻度的label
plt.xticks([0,1], ['a', 'b'], size=8) 
## 不显示xlabel
plt.xlabel('')
## 不显示xticks
plt.xticks([])
## 改变坐标刻度尺度

plt.yscale('log')
# 获取坐标轴
ax = plt.gca()
fig, ax = plt.figure()

# 图例
# 不能在图例中直接指定legend的内容(除了legend标题),legend的内容取决于已经被赋予label的元素
plt.legend(fontsize=6, loc=['upper right'])

# 文本
plt.text(x=1, y=1, s='some text', size=20)

# 节省空间
plt.tight_layout()

# 保存图片
plt.savefig('figure1.pdf')

# 展示图片
plt.show()

2. pandas 基础操作

import pandas as pd

# 读csv文件
data = pd.read_csv('xx.csv')
print(data.head())

# 深拷贝
data1 = data.copy()

# Series 对象 与 Dataframe 对象

## Series 对象https://pandas.pydata.org/docs/reference/api/pandas.Series.html
d = {'a': 1, 'b': 2, 'c': 3}
ser = pd.Series(data=d, index=['a', 'b', 'c'])
print(ser)
## a   1
## b   2
## c   3
## dtype: int64

## Dataframe 对象https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html

d = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data=d)
print(df)
##    col1  col2
## 0     1     3
## 1     2     4


# 取行、取列、赋值https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html
## 错误的用法
row1 = data[0] # 报错,KeyError
row1 = data[0:1] # work, 返回dataframe对象,但是为了避免混乱,还是不要这样用

## 像下面这样用
## 通过label取行和列,需要注意的是行与列的下标都会被理解成str形式的label,而不会被理解成数字,这里比较容易搞错
row1 = data.loc[0] # 返回Series对象
row1 = data.loc[[0]] # 返回Dataframe对象
col1 = data.loc[:, 'column1']

## 通过整数下标取行和列
row1 = data.iloc[0] 
items = data.iloc[0, 0]

## 条件选行
rows = data[(data['gender'] == 'Woman') & (data['age'] < 22)]
rows = data[lambda x : x['gender'] == 'Woman']

## 条件选行并赋值
data.loc[data['gender'] == 'Woman', 'gender'] = 'girl'

# 修改行或列名,传入一个字典作为参数,没有出现在字典中的行名或列名保持不变
## 修改行名
data.rename({0:'1st'}, axis=0, inplace=True) 
## 修改列名
data.rename({'gender':'Genger'}, axis=1, inplace=True)

# 拼接
data = pd.concat([data0, data1], axis=0)

# 每列的类型
print(data.dtypes)
# 所有列名
print(data.columns)

# 增加一列
data['new column'] = 1
## 根据现有的某列给新的一列赋值
data[data['gender'] == 'Woman', 'new column'] = 1

# 转换为ndarray
array = data.values
## index
index_array = data.index.values
## columns
column_array = data.columns.values

# 转换为list列表
list = data.values.tolist()

# 排序,默认从小到大
data_ctx = data_ctx.sort_values(by=['gasFee'])

# groupby,当想要按某列的值分割dataFrame时可以使用
data_itx = data_itx.groupby('gasFee').mean()

3. 折线图

lineType = [':s', '-x', '-^', '->', '--o']
# markerfacecolor='none' 使 marker 空心
# x和y分别表示横坐标列表和纵坐标列表
plt.plot(x, y, lineType[i], markerfacecolor='none', label=methods[i], markersize=10, color=colors[i])

4. 散点图

colors = ['tab:blue', 'tab:orange', ...]
# 前两个参数分别表示横坐标列表和纵坐标列表
plt.scatter(data_ctx['gasFee'], data_ctx['queueing_time'], marker=markers[i], edgecolors=colors[i], color='none', label=methods[i] + ', CTX\'s plot', s=marker_size[i])

5. 柱状图

# 以下所有参数都可以是列表或单个值
plt.bar(x=[0,1], height=[2,4], width=0.5, color='lab:blue', label='label name')

# 堆积柱状图
plt.bar(x, height1, bottom=0)
plt.bar(x, height2, bottom=height1)

# 填充
hacthes = ['\\', 'x', '/', '+', '.']
plt.bar(i, ratio, hatch=hacthes[i], label=methods[i])

6. 直方图

plt.hist(x=[0,1,2,2,3,...], bins=100, width=0.5, color='blue')

# 直方图两项对比
plt.hist([data_0['queueing_time'].array, data_1['queueing_time'].array], bins=20, label=['Cross-shard TXs', 'Intra-shard TXs'], color=[color1, color2])

7. 箱线图

import seaborn as sns
# 当数据集是dataframe对象
# 根据x分类,绘制关于y的箱线图
sns.boxplot(x='column1', y='column2', data=data, palette=[color1,color2], width=0.5)
# 更通用的方式
sns.boxplot(x=[], y=[], palette=[color1,color2],width=0.5)

# 多组对比
# 根据x分类,每类是一个组,组内根据hue分类,绘制关于y的箱线图
sns.boxplot(x='column1', y='column2', hue='column3', data=data, ...)

8. 绘制子图

# 方法一,不精细
plt.figure(figsize=(width, height))
plt.subplot(131) # 将图片分成一行三列,接下来的子图放在第一列
plt.plot(...)
plt.subplot(132)
plt.plot(...)
plt.subplot(233) # 将图片分成二行三列,接下来的子图放在第一行第三列
plt.plot(...)
plt.tight_layout()
plt.show()

# 方法二,精细排版
import matplotlib.gridspec as gridspec
plt.figure(figsize=(width, height))
gs = gridspec.GridSpec(30, 30) # 将图片分成30行30列
plt.subplot(gs[:9, :5]) # 接下来的子图占据前9行的前5列
plt.plot(...)
plt.subplot(gs[10:20, 6:13])
plt.plot(...)
plt.tight_layout()
plt.show()

# 注意事项
## 不要在画子图的时候tight_layout和show,在画完最后一张子图后再运行这两个方法

9. cdf图

(pip install statsmodels)
from statsmodels.distributions.empirical_distribution import ECDF
data = pd.read_csv(v + 'unionctx.csv')
data = data.loc[:, 'queueing_time']

# 根据data,生成ecdf对象
ecdf = ECDF(data)
data_min = min(data)
data_max = max(data)
x = np.linspace(data_min, data_max, number[i])
x = list(x)
# 对每一个已选择的x,生成对应cdf图上的值
y = ecdf(x)
plt.plot(x, y, lineType[i], markerfacecolor='none', label=methods[i], markersize=10, color=colors[i])

10. 图中图

from mpl_toolkits.axes_grid1.inset_locator import inset_axes
# 画大图
plt.figure(figsize=(5,3))
......
plt.hist([data[0], data[1], data[2]], bins=10, label=methods)

# 画小图
ax = plt.gca() # 获得大图的坐标系
axins = inset_axes(ax, width="60%", height="40%", loc='lower left', bbox_to_anchor=(0.36, 0.1, 1, 1), bbox_transform=ax.transAxes)

# 小图的画图参数与大图完全一致,然后通过设置xlim和ylim达到局部放大的效果   
axins.hist([data[0], data[1], data[2]], bins=10, label=methods)
axins.set_xlim(20,64)
axins.set_ylim(0,1000)

plt.tight_layout()
plt.show()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值