R语言<--->Python第三章--图形初阶
程序员文章站
2022-07-14 20:45:51
...
图形初阶
使用图形
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import load_iris
data = load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['target'] = data.target
df.head()
sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | target | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | 0 |
1 | 4.9 | 3.0 | 1.4 | 0.2 | 0 |
2 | 4.7 | 3.2 | 1.3 | 0.2 | 0 |
3 | 4.6 | 3.1 | 1.5 | 0.2 | 0 |
4 | 5.0 | 3.6 | 1.4 | 0.2 | 0 |
plt.plot(df['sepal length (cm)'], df['sepal width (cm)'], 'o')
plt.title("Relevance between Sepal_length and Sepal_width")
plt.savefig("mygraph.pdf")
plt.show()
一个简单的例子
dose = [20, 30, 40, 45, 60]
drugA = [16, 20, 27, 40, 60]
drugB = [15, 18, 25, 31, 40]
plt.plot(dose, drugA, marker="o", mfc="white") # markerfacecolor
plt.xlabel("drugA")
plt.ylabel("dose")
plt.show()
图形参数
import matplotlib as mpl
方法一:matplotlib.rcParams
rc = mpl.rcParams # 参数字典
rc['lines.linestyle'] = "-."
rc['lines.marker'] = "^"
plt.plot(dose, drugA)
plt.xlabel("drugA")
plt.ylabel("dose")
plt.show()
mpl.rcdefaults() # 恢复默认值
方法二:matplotlib.rcParams.update
params = {'lines.linestyle':'-.',
'lines.marker':'^'}
mpl.rcParams.update(params)
plt.plot(dose, drugA)
plt.xlabel("drugA")
plt.ylabel("dose")
plt.show()
mpl.rcdefaults() # 恢复默认值
方法三:matplotlib.rc
mpl.rc('lines', linewidth=3.5, linestyle=':')
plt.plot(dose, drugA)
plt.xlabel("drugA")
plt.ylabel("dose")
plt.show()
mpl.rcdefaults() # 恢复默认值
符号和线条
参数 | 描述 |
---|---|
marker | 绘制点时使用的符号 |
markersize | 符号大小 |
markeredgewidth(mew) | 符号边缘宽度 |
linestyle(ls) | 线条类型 |
linewidth(lw) | 线条宽度 |
marker
linestyle
plt.plot(dose, drugA, ls='--', lw='2.5', marker='s', markersize=6)
plt.show()
颜色
参数 | 描述 |
---|---|
color© | 线条颜色 |
markeredgecolor(mec) | 符号边缘颜色 |
markerfacecolor(mfc) | 符号填充颜色 |
axes.edgecolor | 图表边框颜色 |
axes.facecolor | 图表前景颜色 |
axes.labelcolor | 坐标轴标签颜色 |
axes.titlecolor | 图表标题颜色 |
figure.edgecolor | @@@@ |
figure.facecolor | 图层前景色 |
xtick.color | x轴刻度颜色 |
ytick.color | y轴刻度颜色 |
grid.color | 网格线颜色 |
方法一:通过rcParams全局控制
color_dict = {'axes.edgecolor':'b',
'axes.facecolor':'gray',
'axes.labelcolor':'r',
'axes.titlecolor':'y',
'figure.edgecolor':'red',
'figure.facecolor':'g',
'xtick.color':'r',
'ytick.color':'r',
'grid.color':'b'}
mpl.rcParams.update(color_dict)
plt.plot(dose, drugA, color='r')
plt.title("Title")
plt.xlabel("X_label")
plt.ylabel("Y_label")
plt.grid() # 开启网格线
plt.show()
mpl.rcdefaults()
方法二:plt画图时通过fontdict局部控制
plt.plot(dose, drugA, color='r')
plt.title("Title", fontdict={'color':'r'})
plt.xlabel("X_label", fontdict={'color':'g'})
plt.ylabel("Y_label", fontdict={'color':'b'})
plt.grid(color='y')
方法三:ax画图时通过fontdict控制
fig, ax = plt.subplots()
ax.plot(dose, drugA)
ax.set_title('Title', fontdict={'color':'r'})
ax.set_xlabel('X_label', fontdict={'color':'g'})
ytick = ax.get_yticks()
# print(ytick)
ax.set_yticks(ytick) # 设置y轴刻度位置
ax.set_yticklabels(ytick, fontdict={'color':'b'}) # 设置y轴刻度标识
ax.tick_params(axis='y', color='r', width=2) # 这个方法包含更多的可调参数
plt.show()
调色工具Palettable
安装:pip install palettable
详情:https://jiffyclub.github.io/palettable/
from palettable.colorbrewer.sequential import GnBu_7
# GnBu_7.mpl_colors返回一个matplotlib可用的0-1间的RGB列表
plt.bar(list(range(7)), 1, color=GnBu_7.mpl_colors)
<BarContainer object of 7 artists>
文本属性–通过fontdict参数控制
font_dict = {'family':'fantasy',
'size':15,
'style':'italic', # 斜体
'weight':'bold',
}
plt.plot(dose, drugA)
plt.title("Title", fontdict=font_dict)
plt.xlabel("X_label")
plt.ylabel("Y_label")
plt.xticks(rotation=30) # **kwargs
plt.show()
文本属性的可调参数来源于matplotlib.text.Text类,详情见https://matplotlib.org/api/text_api.html#matplotlib.text.Text
图形尺寸
在创建图层时确定尺寸
plt.figure(figsize=(10,6))
plt.plot(dose, drugA)
plt.show()
## 使用图形参数控制图形外观
dose = [20, 30, 40, 45, 60]
drugA = [16, 20, 27, 40, 60]
drugB = [15, 18, 25, 31, 40]
mpl.rc('lines', lw=2)
mpl.rc('font', size=15)
plt.figure(figsize=(14,8))
plt.subplot(121)
plt.plot(dose, drugA, ls='--', marker='o', color='r')
plt.xlabel('dose')
plt.ylabel('drugA')
plt.xticks(style='italic')
plt.yticks(style='italic')
plt.subplot(122)
plt.plot(dose, drugB, ls='-.', marker='D', color='blue', mfc='blue', mec='green', mew=2)
plt.xlabel('dose')
plt.ylabel('drugB')
plt.xticks(style='italic')
plt.yticks(style='italic')
mpl.rcdefaults()
添加文本、自定义坐标轴和图例
plt.plot(dose, drugA, ls='--', marker='^',
c='r', lw='2')
plt.title("Clinical Trials for Drug A", weight='bold')
plt.suptitle("This is hypothetial data", y=0) # y指定纵方向位置
plt.xlabel("Dosage")
plt.ylabel("Drug Response")
plt.xlim((0, 60)) # x轴范围
plt.ylim((0, 70)) # y轴范围
plt.show()
标题
plt.title('My Title', color='red')
Text(0.5, 1.0, 'My Title')
**坐标轴
参考线
plt.axhline(0.5, xmin=0.2, xmax=0.8, c='r', ls='--')
<matplotlib.lines.Line2D at 0x1a78e42aec8>
图例
plt.plot(dose, drugA, c='r', marker='D', label='A')
plt.plot(dose, drugB, c='b', ls='--', marker='^', label='B')
plt.axhline(y=30, lw='.5', ls='--', c='gray')
plt.title("Drug A vs. Drug B", weight='bold')
plt.xlabel("Drug Dosage")
plt.ylabel("Drug Response")
plt.ylim((0, 60))
plt.legend(title='Drug Type')
plt.show()
文本标注
plt.text(x=0.5, y=0.5, s='My Text')
Text(0.5, 0.5, 'My Text')
df = pd.read_csv("mtcars.csv", index_col=0)
df.head()
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
plt.plot(df.wt, df.mpg, 'o', marker='D', markersize=3, c='b')
for i in range(len(df)):
plt.text(df.wt[i]+0.06, df.mpg[i]-0.2, df.index[i], fontsize=7, style='italic')
plt.title("Mileage vs. Car Weight", weight='bold')
plt.xlabel("Weight")
plt.ylabel("Mileage")
plt.show()
plt.rc('font', size=15)
plt.text(0.2, 0.5, 'Example of serif text', family='serif')
plt.text(0.2, 0.6, 'Example of sans-serif text', family='fans-serif')
plt.text(0.2, 0.7, 'Example of fantasy text', family='fantasy')
plt.text(0.2, 0.8, 'Example of monospace text', family='monospace')
plt.rcdefaults()
数学标注
plt.title('$Math Annotation \\beta$')
plt.text(0.5, 0.5, '$\\alpha \\lambda \\beta$')
plt.ylabel('$\\alpha$')
plt.xlabel('$\\delta$')
plt.show()
图形的组合
df.head()
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
mpl.rc('axes', titleweight='bold')
mpl.rc('lines', markerfacecolor='white', markeredgecolor='black')
plt.figure(figsize=(14,8))
plt.subplot(2,2,1)
plt.plot(df.wt, df.mpg, 'o')
plt.title("Scatterplot of wt vs. mpg")
plt.subplot(2,2,2)
plt.plot(df.wt, df.disp, 'o')
plt.title("Scatterplot of wt vs. disp")
plt.subplot(2,2,3)
plt.hist(df.wt, fc='white', ec='black') # facecolor, edgecolor
plt.title("Histogram of wt")
plt.subplot(2,2,4)
plt.boxplot(df.wt)
plt.title("Boxplot of wt")
mpl.rcdefaults()
fig, ax = plt.subplots(3,1)
ax[0].hist(df.wt)
ax[1].hist(df.mpg)
ax[2].hist(df.disp)
plt.show()
更加精细的调节
fig = plt.figure(constrained_layout=True) # 自动调整布局
gs = fig.add_gridspec(2,2)
plt.subplot(gs[0,:])
plt.hist(df.wt)
plt.subplot(gs[1,0])
plt.hist(df.mpg)
plt.subplot(gs[1,1])
plt.hist(df.disp)
plt.show()
下图中,第1行图的高度是第二行的 1 / 2 1/2 1/2,右下角图的宽度是左下角的 1 / 3 1/3 1/3
fig = plt.figure(constrained_layout=True) # 自动调整布局
gs = fig.add_gridspec(nrows=3, ncols=4)
plt.subplot(gs[0,:])
plt.hist(df.wt)
plt.subplot(gs[1:,0:3])
plt.hist(df.mpg)
plt.subplot(gs[1:,3])
plt.hist(df.disp)
plt.show()