Python数据可视化(二):折线图绘制

使用matplotlib包绘制折线图

image.png
# 导入所需的python包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 设置绘图格式
plt.style.use('seaborn')
%matplotlib inline
# 创建示例数据
values=np.cumsum(np.random.randn(1000,1))

# 查看示例数据
values[1:10]
array([ 0.24297415,  0.8161543 ,  0.32656029, -0.17953043, -0.80225196,
       -1.27380905, -0.28938979, -3.42407114, -3.58398279])</pre>

绘制基础折线图

# use the plot function
plt.plot(values)

# show the graph
plt.show()
image.png
# 绘制未排序数据的折线图

# import the iris dataset
# 加载示例数据
df = sns.load_dataset('iris')
df.head(10)
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
5 5.4 3.9 1.7 0.4 setosa
6 4.6 3.4 1.4 0.3 setosa
7 5.0 3.4 1.5 0.2 setosa
8 4.4 2.9 1.4 0.2 setosa
9 4.9 3.1 1.5 0.1 setosa
# plot
plt.plot( 'sepal_width', 'sepal_length', data=df)

# show the graph
plt.show()
image.png
# 绘制排序后数据的折线图

# 构建示例数据
df=pd.DataFrame({'xvalues': range(1,101), 'yvalues': np.random.randn(100) })
df.head(10)
xvalues yvalues
0 1 0.876885
1 2 0.695569
2 3 0.807841
3 4 0.447100
4 5 -0.186339
5 6 -1.212736
6 7 0.235604
7 8 1.157926
8 9 -0.733519
9 10 0.864461
# plot
plt.plot( 'xvalues', 'yvalues', data=df)

# show the graph
plt.show()
image.png

自定义线的颜色

# 构建示例数据
df=pd.DataFrame({'x_values': range(1,11), 'y_values': np.random.randn(10) })

# Draw plot
# 设置color参数自定义线的颜色
plt.plot( 'x_values', 'y_values', data=df, color='skyblue')
plt.show()
image.png
# Draw line chart by modifiying transparency of the line
# 设置alpha参数更改线的透明度
plt.plot( 'x_values', 'y_values', data=df, color='red', alpha=0.3)

# Show plot
plt.show()
image.png

自定义线的类型

# Draw line chart with dashed line
# 设置linestyle参数自定义闲的类型
plt.plot( 'x_values', 'y_values', data=df, linestyle='dashed')

# Show graph
plt.show()
image.png
# 查看不同的线型
plt.plot( [1,1.1,1,1.1,1], linestyle='-' , linewidth=4)
plt.text(1.5, 1.3, "linestyle = '-' ", horizontalalignment='left', size='medium', color='C0', weight='semibold')

plt.plot( [2,2.1,2,2.1,2], linestyle='--' , linewidth=4 )
plt.text(1.5, 2.3, "linestyle = '--' ", horizontalalignment='left', size='medium', color='C1', weight='semibold')

plt.plot( [3,3.1,3,3.1,3], linestyle='-.' , linewidth=4 )
plt.text(1.5, 3.3, "linestyle = '-.' ", horizontalalignment='left', size='medium', color='C2', weight='semibold')

plt.plot( [4,4.1,4,4.1,4], linestyle=':' , linewidth=4 )
plt.text(1.5, 4.3, "linestyle = ':' ", horizontalalignment='left', size='medium', color='C3', weight='semibold')

plt.axis('off')
plt.show()
image.png

自定义线的宽度

# Modify line width of the graph
# 设置linewidth参数自定义线的宽度
plt.plot( 'x_values', 'y_values', data=df, linewidth=22)

# Show graph
plt.show()
image.png

绘制多线折线图

# Data
# 构建示例数据
df=pd.DataFrame({'x_values': range(1,11), 'y1_values': np.random.randn(10), 'y2_values': np.random.randn(10)+range(1,11), 'y3_values': np.random.randn(10)+range(11,21) })

df.head(10)
x_values y1_values y2_values y3_values
0 1 1.067931 1.387085 10.330824
1 2 -0.539553 1.718083 12.094820
2 3 0.031352 2.526630 11.560346
3 4 -0.693288 3.364125 12.002817
4 5 -0.176465 6.821868 13.932456
5 6 1.109269 5.875778 15.407165
6 7 -0.750049 5.325365 18.765016
7 8 2.084154 8.578474 18.401151
8 9 0.418775 9.524832 19.062925
9 10 2.051114 9.682992 18.867805
# multiple line plots
plt.plot( 'x_values', 'y1_values', data=df, marker='o', markerfacecolor='blue', markersize=12, color='skyblue', linewidth=4)
plt.plot( 'x_values', 'y2_values', data=df, marker='', color='olive', linewidth=2)
plt.plot( 'x_values', 'y3_values', data=df, marker='', color='red', linewidth=3, linestyle='dashed', label="toto")

# show legend
plt.legend()

# show graph
plt.show()
image.png

高亮特定折线

# Change the style of plot
plt.style.use('seaborn-darkgrid')

# set figure size
my_dpi=96
plt.figure(figsize=(480/my_dpi, 480/my_dpi), dpi=my_dpi)
# Make a data frame
df=pd.DataFrame({'x': range(1,11), 'y1': np.random.randn(10), 'y2': np.random.randn(10)+range(1,11), 'y3': np.random.randn(10)+range(11,21), 'y4': np.random.randn(10)+range(6,16), 'y5': np.random.randn(10)+range(4,14)+(0,0,0,0,0,0,0,-3,-8,-6), 'y6': np.random.randn(10)+range(2,12), 'y7': np.random.randn(10)+range(5,15), 'y8': np.random.randn(10)+range(4,14) })
df.head(10)
x y1 y2 y3 y4 y5 y6 y7 y8
0 1 -0.687924 2.584799 11.480629 7.847702 3.962812 2.817641 4.716701 5.037785
1 2 -1.190644 2.509128 10.639934 6.096679 6.023990 3.593341 5.784641 3.675451
2 3 -0.355472 1.879478 13.651546 8.620174 6.008777 2.712259 6.934400 6.219872
3 4 0.978479 4.565185 12.986859 9.257281 7.801419 4.372574 8.886010 7.617974
4 5 -0.137379 6.454554 13.882441 8.835127 6.986779 7.970914 8.343824 9.527383
5 6 1.479008 4.857621 16.752558 11.290006 8.520126 6.507897 10.274646 7.339675
6 7 -0.862117 4.919770 18.905680 13.265195 10.892788 7.208971 10.757919 8.773337
7 8 -0.787397 9.109201 17.460583 12.353985 7.479977 8.964906 12.300782 11.636784
8 9 0.815745 8.755666 18.685683 12.728094 4.306399 10.714981 13.400910 11.165933
9 10 0.443319 9.686925 20.563202 16.168934 6.827163 10.188284 15.023878 13.611045
# 绘制多条折线图
# plot multiple lines
for column in df.drop('x', axis=1):
    plt.plot(df['x'], df[column], marker='', color='grey', linewidth=1, alpha=0.4)

# 高亮其中的一条折线
# Now re do the interesting curve, but biger with distinct color
plt.plot(df['x'], df['y5'], marker='', color='orange', linewidth=4, alpha=0.7)

# Change x axis limit
plt.xlim(0,12)

# 给每条折线添加注释信息
# Let's annotate the plot
num=0
for i in df.values[9][1:]:
    num+=1
    name=list(df)[num]
    if name != 'y5':
        plt.text(10.2, i, name, horizontalalignment='left', size='small', color='gray')

# And add a special annotation for the group we are interested in
plt.text(10.2, df.y5.tail(1), 'Mr Orange', horizontalalignment='left', size='small', color='orange')

# 添加标题和坐标轴
# Add titles
plt.title("Evolution of Mr Orange vs other students", loc='left', fontsize=12, fontweight=0, color='orange')
plt.xlabel("Time")
plt.ylabel("Score")

# Show the graph
plt.show()
image.png

绘制分面折线图

# Initialize the figure style
plt.style.use('seaborn-darkgrid')

# create a color palette
palette = plt.get_cmap('Set1')
# 构建示例数据
# Make a data frame
df=pd.DataFrame({'x': range(1,11), 'y1': np.random.randn(10), 'y2': np.random.randn(10)+range(1,11), 'y3': np.random.randn(10)+range(11,21), 'y4': np.random.randn(10)+range(6,16), 'y5': np.random.randn(10)+range(4,14)+(0,0,0,0,0,0,0,-3,-8,-6), 'y6': np.random.randn(10)+range(2,12), 'y7': np.random.randn(10)+range(5,15), 'y8': np.random.randn(10)+range(4,14), 'y9': np.random.randn(10)+range(4,14) })
df.head(10)
x y1 y2 y3 y4 y5 y6 y7 y8 y9
0 1 0.705547 -0.185696 13.079950 4.935681 3.558236 1.987303 3.777348 4.319105 3.013749
1 2 1.207474 3.093301 12.163533 5.769417 5.644947 3.789781 7.864374 4.913551 5.306410
2 3 -1.078666 3.198830 12.653673 8.683952 7.618591 3.482401 7.515903 5.254345 5.381230
3 4 -1.171316 4.410335 12.971149 10.613208 6.895600 4.867909 8.421857 7.340826 7.443260
4 5 1.270850 5.748285 16.414187 9.581892 7.723042 6.661644 8.781812 8.272855 7.745660
5 6 -0.302443 6.361198 16.327518 9.788331 8.850974 6.881167 9.072248 10.308536 7.794249
6 7 -0.475574 7.620870 17.139569 13.205853 11.437107 6.388262 11.043212 9.883755 10.771894
7 8 0.363418 6.782794 17.710851 13.262601 9.111311 9.904678 13.348669 10.125153 10.947822
8 9 3.034346 10.164225 19.036592 14.160345 4.305579 8.897607 12.429754 11.348469 11.271929
9 10 1.141996 9.590279 19.169931 16.149196 6.473655 10.561281 14.805126 12.603702 11.674404
# multiple line plot
num=0
for column in df.drop('x', axis=1):
    num+=1

    # Find the right spot on the plot
    plt.subplot(3,3, num)

    # Plot the lineplot
    plt.plot(df['x'], df[column], marker='', color=palette(num), linewidth=1.9, alpha=0.9, label=column)

    # Same limits for every chart
    plt.xlim(0,10)
    plt.ylim(-2,22)

    # Not ticks everywhere
    if num in range(7) :
        plt.tick_params(labelbottom='off')
    if num not in [1,4,7] :
        plt.tick_params(labelleft='off')

    # Add title
    plt.title(column, loc='center', fontsize=12, fontweight=0, color=palette(num) )

# general title
plt.suptitle("How the 9 students improved\nthese past few days?", fontsize=13, fontweight=0, color='black', style='italic', y=1.02)

# Axis titles
plt.text(5, 0, 'Time', ha='center', va='center')
plt.text(0, 10, 'Note', ha='center', va='center', rotation='vertical')

# Show the graph
plt.show()
image.png
# multiple line plot
num=0
for column in df.drop('x', axis=1):
    num+=1

    # Find the right spot on the plot
    plt.subplot(3,3, num)

    # plot every group, but discrete
    for v in df.drop('x', axis=1):
        plt.plot(df['x'], df[v], marker='', color='grey', linewidth=1, alpha=0.3)

    # Plot the lineplot
    plt.plot(df['x'], df[column], marker='', color=palette(num), linewidth=3, alpha=0.9, label=column)

    # Same limits for every chart
    plt.xlim(0,10)
    plt.ylim(-2,22)

    # Not ticks everywhere
    if num in range(7) :
        plt.tick_params(labelbottom='off')
    if num not in [1,4,7] :
        plt.tick_params(labelleft='off')

    # Add title
    plt.title(column, loc='center', fontsize=12, fontweight=0, color=palette(num) )

# general title
plt.suptitle("How the 9 students improved\nthese past few days?", fontsize=13, fontweight=0, color='black', style='italic', y=1.02)

# Axis titles
plt.text(5, 0, 'Time', ha='center', va='center')
plt.text(0, 10, 'Note', ha='center', va='center', rotation='vertical')

# Show the graph
plt.show()
image.png

参考来源:https://www.python-graph-gallery.com/line-chart/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容