有一个月的温度数据,想要画一个日历,是一个单个月份的日历,上面有日期,然后温度超过35度的在日历对应的日期格子里填红,怎么画?
时间: 2024-03-15 11:44:25 浏览: 57
要画一个日历,可以使用Python中的第三方库`calendar`,它可以方便地生成一个指定月份的日历。而要在日历格子里填充颜色,可以使用Python中的第三方库`matplotlib`。
首先,我们可以用`calendar`库生成指定月份的日历,然后根据具体需求,将超过35度的日期标记出来。具体代码如下:
```python
import calendar
def generate_calendar(year, month, temp_data):
# 生成指定月份的日历
cal = calendar.monthcalendar(year, month)
# 创建一个二维列表,用于存储每个日期的颜色
color_map = [[None]*7 for i in range(6)]
# 遍历温度数据,将超过35度的日期标记为红色
for date, temp in temp_data.items():
if temp > 35:
week_day = calendar.weekday(year, month, date)
week_num = (date - 1) // 7
color_map[week_num][week_day] = 'red'
# 输出日历
print(calendar.month_name[month], year)
print('Mo Tu We Th Fr Sa Su')
for week in cal:
for day in week:
if day == 0:
print(' ', end='')
else:
if color_map[cal.index(week)][week.index(day)] == 'red':
print('\033[31m{:2d}\033[0m'.format(day), end=' ')
else:
print('{:2d}'.format(day), end=' ')
print()
```
其中,`year`和`month`表示要生成日历的年份和月份,`temp_data`是一个字典,键为日期,值为温度。然后,我们遍历温度数据,找出温度超过35度的日期,计算出它们在日历中的位置,并将其标记为红色。最后,我们输出日历,如果某个日期被标记为红色,就使用`'\033[31m'`和`'\033[0m'`将其输出为红色。
接着,我们可以使用`matplotlib`库,将生成的日历保存为图片。具体代码如下:
```python
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
def save_calendar(year, month, temp_data, file_name):
# 生成指定月份的日历和颜色
cal = calendar.monthcalendar(year, month)
color_map = [[None]*7 for i in range(6)]
for date, temp in temp_data.items():
if temp > 35:
week_day = calendar.weekday(year, month, date)
week_num = (date - 1) // 7
color_map[week_num][week_day] = 'red'
# 绘制日历
fig, ax = plt.subplots()
ax.set_xlim(0.5, 7.5)
ax.set_ylim(6.5, 0.5)
ax.set_xticks(range(1, 8))
ax.set_yticks(range(1, 7))
ax.set_xticklabels(['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'])
ax.set_yticklabels(['', '', '', '', '', ''])
ax.tick_params(axis='both', which='both', length=0)
for i, week in enumerate(cal):
for j, day in enumerate(week):
if day != 0:
if color_map[i][j] == 'red':
ax.add_patch(Rectangle((j+1, 6-i), 1, 1, facecolor='red'))
else:
ax.add_patch(Rectangle((j+1, 6-i), 1, 1, facecolor='white', edgecolor='gray', lw=1))
# 保存日历为图片
fig.set_size_inches(6, 4)
fig.savefig(file_name, dpi=200, bbox_inches='tight')
```
其中,`file_name`表示要保存的文件名。我们先绘制一个空的坐标系,并设置其范围、刻度、标签和样式。然后,根据生成的颜色,绘制每个日期的矩形,并将超过35度的日期标记为红色。最后,我们将绘制的日历保存为图片。
需要注意的是,由于`matplotlib`库默认的颜色是RGB格式,而终端中输出的颜色是ANSI格式,因此在输出日历时,需要使用`'\033[31m'`和`'\033[0m'`将输出的文本包裹起来,才能正确地显示颜色。而在绘制日历时,则需要直接使用颜色名称,如`'red'`、`'white'`等。
阅读全文