介紹三種繪制時(shí)間線圖的方法
前面分享過一篇自動(dòng)化制作《歷史上的今天》時(shí)間線圖片的文章,小伙伴們普遍反映還不錯(cuò),尤其是制作時(shí)間線的方法,還是非常巧妙的。今天我們?cè)賮矸窒韼追N不同的制作方法,大家可以自行比較下各種方法的優(yōu)劣
Matplotlib 制作
Matplotlib 作為 Python 家族最為重要的可視化工具,其基本的 API 以及繪制流程還是需要掌握的。尤其是該庫(kù)的靈活程度以及作為眾多工具的基礎(chǔ),重要性不言而喻
下面我們來看下該如何繪制一個(gè)時(shí)間線圖表
導(dǎo)入庫(kù)以及設(shè)置 XY 軸數(shù)據(jù)
import?matplotlib.pyplot?as?plt
plt.rcParams['font.sans-serif']?=?['SimHei']
plt.rcParams['axes.unicode_minus']?=?False
y1?=?[5,?10,?15,?20,?25,?30,?35,?40,?45,?50]
x1?=?[4,?4,?4,?4,?4,?4,?4,?4,?4,?4]
因?yàn)槭峭ㄟ^折線圖來實(shí)現(xiàn)時(shí)間線效果,為了達(dá)到展示一條豎線的情況,這里設(shè)置了 X 軸數(shù)值都相同,Y 軸數(shù)值等差分布
創(chuàng)建畫布及標(biāo)題
fig,?ax?=?plt.subplots(sharey=True,?figsize=(7,?4))
ax.plot(x1,?y1,?label='First?line',?linewidth=3,?color='r',?marker='o',?markerfacecolor='white',?markersize=12)
plt.title('蘿卜大雜燴')
plt.suptitle('歷史上的今天',?fontsize=16,?color='red')
此時(shí)效果如下

接下來我們?cè)O(shè)置時(shí)間線兩邊的數(shù)據(jù)
#?右側(cè)數(shù)據(jù)
right_y_year?=?0.95
right_y_text?=?0.9
year_right?=?1931
for?i?in?range(5):
????plt.text(0.57,?right_y_year,?str(year_right+1),?fontsize=15,?horizontalalignment='center',?verticalalignment='center',?
?????????????transform=ax.transAxes,?color='black')
????plt.text(0.75,?right_y_text,?"從百草園到三味書屋-魯迅"?+?str(i),?fontsize=15,?horizontalalignment='center',?verticalalignment='center',?
?????????????transform=ax.transAxes,?color='red')
????right_y_year?-=?0.2
????right_y_text?-=?0.2
????year_right?+=?1
????
#?左側(cè)數(shù)據(jù)
left_y_year?=?0.85
left_y_text?=?0.8
year_left?=?1941
for?i?in?range(5):
????plt.text(0.43,?left_y_year,?str(year_left+1),?fontsize=15,?horizontalalignment='center',?verticalalignment='center',?
?????????????transform=ax.transAxes,?color='black')
????plt.text(0.2,?left_y_text,?"從百草園到三味書屋-魯迅"?+?str(i),?fontsize=15,?horizontalalignment='center',?verticalalignment='center',?
?????????????transform=ax.transAxes,?color='red',?url='https://www.baidu.com')
????left_y_year?-=?0.2
????left_y_text?-=?0.2
????year_left?+=?1
主要使用了 text 函數(shù),為時(shí)間線軸兩邊分別添加數(shù)據(jù)
如果我們還想要添加個(gè)人的其他信息,比如公眾號(hào)二維碼等,可以在指定位置增加圖片,同時(shí)去掉坐標(biāo)軸
#?增加圖片
img?=?plt.imread('二維碼.png')
ax2?=?plt.axes((0.7,?0.1,?0.3,?0.3))
ax2.imshow(img,?origin='lower',?alpha=0.5)
ax2.axis('off')
ax.axis('off')
plt.show()
最終效果如下

可以看出,由于 text 函數(shù)是通過坐標(biāo)來確定文字顯示的位置的,所以我們時(shí)間線軸兩邊的數(shù)據(jù)分布還是不是特別完美,不知道是否有其他的更加方便的方法來設(shè)置,待探索。。。
Plotly 繪制
Plotly 作為 Python 家族另一個(gè)非常強(qiáng)大的可視化工具,同樣可以完成時(shí)間線圖的繪制
在繪圖之前,我們先處理數(shù)據(jù)
這里使用的數(shù)據(jù)是2020年全年的微博熱搜數(shù)據(jù)
import?pandas?as?pd
weibo?=?pd.read_csv("weibo_2020.csv")
def?deal_date(frame):
????tmp?=?frame.split('-')
????return?tmp[0]?+?'-'?+?tmp[1]
weibo['new_date']?=?weibo['date'].apply(lambda?x?:?deal_date(x))
key_list_right?=?[]
for?i?in?range(1,?12,?2):
????if?i?10:
????????mydate?=?'2020-0%s'?%?str(i)
????else:
????????mydate?=?'2020-%s'?%?str(i)
????keyword?=?weibo[weibo['new_date']?==?mydate].sort_values(by='searchCount',?ascending=False)['keyword'].tolist()[0]
????searchCount?=?weibo[weibo['new_date']?==?mydate].sort_values(by='searchCount',?ascending=False)['searchCount'].tolist()[0]
????mount?=?str(i)?+?'月'
????content?=?','.join([keyword,?str(searchCount)?+?'搜索量',?mount])
????key_list_right.append(content)
print(key_list_right)
Output:
['最新疫情地圖,18130201搜索量,1月',
'肖戰(zhàn)工作室道歉,13117531搜索量,3月',
'何鴻燊去世,15302424搜索量,5月',
'高考作文,15647446搜索量,7月',
'乘風(fēng)破浪的姐姐成團(tuán)之夜,8226994搜索量,9月',
'特朗普,7310000搜索量,11月']
可以看到,通過上面的數(shù)據(jù)處理,我們成功提取了1、3、5、7、9以及11月的當(dāng)月搜索量最高的熱搜標(biāo)題,同理可以獲取到雙月份的熱搜標(biāo)題數(shù)據(jù)
下面開始作圖
import?plotly.express?as?px
import?plotly.graph_objects?as?go
from?plotly.subplots?import?make_subplots
import?pandas?as?pd
from?plotly.graph_objs?import?*
layout?=?Layout(
????paper_bgcolor='rgba(0,0,0,0)',
????plot_bgcolor='rgba(0,0,0,0)',
????title={'text':?'微博熱搜',?'x':?0.5},
????yaxis={'title':?'Proportion?(%)'}
)
fig?=?go.Figure(layout=layout)
fig.add_traces([go.Scatter(x=[2,2,2,2,2,2],?y=[5,?10,?15,?20,?25,?30],?text=key_list_right,?textposition="bottom?right",?mode="lines+text"),
????????????????go.Scatter(x=[2,2,2,2,2,2],?y=[5,?10,?15,?20,?25,?30],?textposition="top?left",?mode="lines+text",?text=key_list_left)])?
fig.update_traces(showlegend=False)
fig.update_layout(xaxis=dict(visible=False),?yaxis=dict(visible=False))
fig.show()
通過 Plotly 繪圖就相對(duì)簡(jiǎn)單很多了,直接使用 text 參數(shù)把我們得到的熱搜數(shù)據(jù)添加上即可
最終效果如下

效果很樸素,是因?yàn)槲覀儧]有進(jìn)行過多的樣式設(shè)置,大家可以自行探索下不同樣式
Excel 繪制
上面的兩種方法都需要有一定的代碼基礎(chǔ),下面介紹的 Excel 方法則可以說是人人都能完成,一起來看看吧
先來看看最終的效果

首先準(zhǔn)備數(shù)據(jù),我們?cè)谛陆ǖ?Excel 文檔中創(chuàng)建如下數(shù)據(jù)

然后插入散點(diǎn)圖

先插入一個(gè)空白散點(diǎn)圖,然后將 X 軸設(shè)置為【年份】,Y 軸設(shè)置為【位置】
再把 Y 軸和網(wǎng)格線都刪除
接下來我們美化一下 X 軸

我們雙擊 X 軸,調(diào)出格式窗口,在坐標(biāo)軸選項(xiàng)標(biāo)簽中設(shè)置【單位】,將【小】改為1,設(shè)置【刻度線】,將【主刻度線】設(shè)置為交叉

再點(diǎn)擊【油漆桶】,選擇一個(gè)線條的顏色,將寬度調(diào)整為2,將【結(jié)尾箭頭類型】調(diào)整為向右箭頭
再接下來我們把 X 軸連接起來

首先選擇一個(gè)散點(diǎn),添加誤差線。然后把橫向的誤差線設(shè)置為無(wú)輪廓,再選中豎向的誤差線,把【垂直誤差線】設(shè)置為負(fù)偏差,再把誤差量設(shè)置為100%


最后再給豎向誤差線調(diào)整樣式即可
下面開始添加數(shù)據(jù)
我們把公司的各種大事件添加到數(shù)據(jù)表當(dāng)中

向圖表中添加【數(shù)據(jù)標(biāo)簽】,即數(shù)據(jù)中事件那一列

然后再去掉 Y 值即可
最后我們還可以通過 Excel 自帶的各種圖標(biāo)進(jìn)行美化操作

好了,以上就是今天分享的所有內(nèi)容,如果對(duì)你有幫助,幫忙點(diǎn)贊和在看支持哦~
推薦閱讀
牛逼!Python常用數(shù)據(jù)類型的基本操作(長(zhǎng)文系列第①篇)
牛逼!Python的判斷、循環(huán)和各種表達(dá)式(長(zhǎng)文系列第②篇)
推薦閱讀
牛逼!Python常用數(shù)據(jù)類型的基本操作(長(zhǎng)文系列第①篇)
牛逼!Python的判斷、循環(huán)和各種表達(dá)式(長(zhǎng)文系列第②篇)
