Python中如何可视化GitHub上不同语言star最多的项目
13 回复
docker -> moby
这个问题挺有意思的,用Python来可视化GitHub上不同语言里star最多的项目,我们可以分几步走:爬数据、处理数据、最后画图。核心就是调用GitHub API拿到数据,然后用matplotlib或者seaborn画出来。
下面是一个完整的例子,我们按语言分组,找出每个语言里star数最高的项目,然后做个条形图。
import requests
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime
# GitHub API的基础URL和你的token(如果没有,可以去掉,但会有速率限制)
BASE_URL = "https://api.github.com"
# 如果需要认证,取消下面这行的注释,并把YOUR_TOKEN换成你的token
# headers = {'Authorization': 'token YOUR_TOKEN'}
headers = {}
def get_top_repo_by_language(languages, max_repos_per_lang=10):
"""
获取指定编程语言中star最多的仓库。
参数:
languages: 一个包含编程语言字符串的列表,例如 ['python', 'javascript', 'java']
max_repos_per_lang: 每种语言最多获取多少个仓库进行排序(默认10个)
返回:
一个Pandas DataFrame,包含语言、仓库名、star数等信息。
"""
all_data = []
for lang in languages:
print(f"正在获取 {lang} 语言的数据...")
# 构建搜索查询,按star数降序排列
query = f"language:{lang}+sort:stars"
url = f"{BASE_URL}/search/repositories?q={query}&per_page={max_repos_per_lang}"
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # 检查请求是否成功
data = response.json()
for repo in data.get('items', []):
all_data.append({
'language': lang,
'repo_name': repo['full_name'],
'stars': repo['stargazers_count'],
'forks': repo['forks_count'],
'url': repo['html_url'],
'description': repo['description'],
'updated_at': repo['updated_at']
})
except requests.exceptions.RequestException as e:
print(f"获取 {lang} 数据时出错: {e}")
continue
df = pd.DataFrame(all_data)
# 按语言分组,并找出每组中star数最高的那个仓库
top_repos = df.loc[df.groupby('language')['stars'].idxmax()].reset_index(drop=True)
return top_repos
def visualize_top_repos(df):
"""
可视化每个语言中star最多的仓库。
参数:
df: 包含top仓库数据的DataFrame
"""
if df.empty:
print("没有数据可可视化。")
return
# 按star数排序,让图表看起来更有序
df = df.sort_values('stars', ascending=False)
plt.figure(figsize=(12, 8))
bars = plt.barh(df['language'], df['stars'], color='skyblue')
plt.xlabel('Star数量', fontsize=12)
plt.title('GitHub上不同编程语言中Star最多的项目', fontsize=14, pad=20)
plt.gca().invert_yaxis() # 让最高的在最上面
# 在每个条形末端显示star数
for bar, star in zip(bars, df['stars']):
width = bar.get_width()
plt.text(width + max(df['stars'])*0.01, bar.get_y() + bar.get_height()/2,
f'{star:,}', va='center', fontsize=10)
plt.tight_layout()
plt.show()
# 主程序
if __name__ == "__main__":
# 定义你想分析的语言列表
languages_to_check = ['python', 'javascript', 'java', 'c++', 'go', 'rust', 'typescript']
# 获取数据
top_repos_df = get_top_repo_by_language(languages_to_check, max_repos_per_lang=15)
# 打印结果看看
print("\n各语言中Star最多的仓库:")
print(top_repos_df[['language', 'repo_name', 'stars']].to_string(index=False))
# 可视化
visualize_top_repos(top_repos_df)
代码解释:
-
get_top_repo_by_language函数:- 接收一个语言列表(比如
['python', 'javascript'])。 - 对每种语言,调用GitHub的搜索API (
/search/repositories),查询条件是按该语言筛选并按star数排序。 - 从返回的JSON数据里提取我们需要的信息:仓库全名、star数、fork数等。
- 最后,用Pandas的
groupby找出每种语言里star数最高的那个仓库,返回一个DataFrame。
- 接收一个语言列表(比如
-
visualize_top_repos函数:- 接收上面生成的DataFrame。
- 用matplotlib创建一个水平条形图,y轴是编程语言,x轴是star数量。
- 为了让图表更清晰,我们按star数从高到低排序,并在每个条形后面标注具体的star数。
-
主程序部分:
- 定义你想分析的语言列表。
- 调用函数获取数据并打印出来。
- 调用函数生成图表。
运行前你可能需要做的:
- 安装库:如果你还没装
requests,pandas,matplotlib,用pip装一下:pip install requests pandas matplotlib。 - GitHub API限制:未认证的请求每小时只能发60次。如果你要查很多语言,建议在代码里加上你的GitHub Personal Access Token(在GitHub设置里生成)。把上面代码里的
headers = {}换成:
这样每小时可以发5000次请求。headers = {'Authorization': 'token YOUR_ACTUAL_TOKEN'}
输出示例: 运行后,你会在控制台看到一个表格,大概长这样:
language repo_name stars
python torvalds/linux 150000
javascript facebook/react 210000
java spring-projects... 50000
同时会弹出一个条形图,直观地展示哪个语言里的“明星项目”获得的star最多。
总结建议: 这个方案直接调API拿数据画图,简单有效,你可以根据需要调整语言列表或图表样式。
赞
为何没有我大 iOS 的两大语言
已经补充了
Swift 一堆 MD 。。。
楼主你应该可以做一个 Markdown 的——这样就可以看出到底 markdown 程序员到底是哪种人了
C 的简直不能更威武霸气了,今天才看到 Telegram 是用 C 搞的,有点吃鲸~
还有 CSharp 下面的第二名,呵呵呵呵
有些编程语言的解释器都是 c 写的. 底层的东西也只能用 c 或 c++ 了
js 的数据高出其他语言一个数量级……
thefuck 真是霸气侧漏啊
赞
非常感谢。厉害了我的哥。数据哪里来的

