Я строю гистограмму морского происхождения в Python, однако ширина столбцов отличается, когда я рисую весь набор данных. Когда я рисую только начало набора данных, у меня нет проблем. Как это решить? Был бы признателен за любой совет!
Код для построения всего набора данных, только заголовка, и вывода заголовка кадра данных:
import numpy as np
import pandas as pd
import math
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.dates as md
import matplotlib.ticker as ticker
from datetime import datetime, timedelta
# create dataframes that will be used
date_today = datetime.now()
days = pd.date_range(date_today, date_today + timedelta(310), freq='D')
np.random.seed(seed=1111)
data_a = np.random.randint(-20, high=30, size=len(days))
dataframe = pd.DataFrame({'date': days, 'a': data_a})
dataframe = dataframe.set_index('date')
dataframe_date = dataframe.copy()
dataframe_date = dataframe_date.reset_index()
dataframe_date['date'] = dataframe_date['date'].dt.date
dataframe_date_head = dataframe_date.head(20)
# plot whole dataframe
fig = plt.figure()
ax = plt.axes()
b_plot = sns.barplot(data = dataframe_date, x=dataframe_date['date'], y=dataframe_date['a'], ax=ax)
ax.xaxis.set_major_locator(ticker.AutoLocator())
ax.margins(x=0)
plt.xticks(rotation=70)
ax.set_xticks(np.arange(len(dataframe_date)))
ax.set_xticklabels(dataframe_date.date.apply(lambda x: str(x.day) + '-' + str(x.month) + '-' + str(x.year)))
ax.xaxis.set_major_locator(ticker.AutoLocator())
plt.show()
# plot only head(20) of the dataframe
fig = plt.figure()
ax1 = plt.axes()
b_plot = sns.barplot(data = dataframe_date_head, x=dataframe_date_head['date'], y=dataframe_date_head['a'], ax=ax1)
ax1.xaxis.set_major_locator(ticker.AutoLocator())
ax1.margins(x=0)
plt.xticks(rotation=70)
ax1.set_xticks(np.arange(len(dataframe_date_head)))
ax1.set_xticklabels(dataframe_date_head.date.apply(lambda x: str(x.day) + '-' + str(x.month) + '-' + str(x.year)))
ax1.xaxis.set_major_locator(ticker.AutoLocator())
plt.show()
# print head of the dataframe
dataframe_date_head
date a
0 2022-03-16 8
1 2022-03-17 17
2 2022-03-18 -3
3 2022-03-19 -8
4 2022-03-20 14
5 2022-03-21 4
6 2022-03-22 2
7 2022-03-23 0
8 2022-03-24 -9
9 2022-03-25 -6
10 2022-03-26 -12
11 2022-03-27 18
12 2022-03-28 -8
13 2022-03-29 26
14 2022-03-30 2
15 2022-03-31 -12
16 2022-04-01 21
17 2022-04-02 22
18 2022-04-03 -8
19 2022-04-04 10
Редактировать: Думаю, это как-то связано с моей средой (я использую Jupyter Notebook на Microsoft Edge)
Вот вывод с использованием следующего кода, предложенного для bar_plot:
b_plot = sns.barplot(data = dataframe_date, x=dataframe_date['date'], y=dataframe_date['a'], ax=ax, color = 'blue', ec='blue', lw=0.5)
Я отредактировал, чтобы у вас также были данные в виде текста. Это также в коде, который я предоставил
@JohanC да, к сожалению, он дает тот же график
ХОРОШО. Цвет края по умолчанию — «нет», поэтому изменение ширины линии не будет видно. Может sns.barplot(..., ec='white', lw=0.5)
? Или sns.barplot(..., color='skyblue', ec='skyblue', lw=0.5)
?
@JohanC спасибо за предложение - я думал, что это сработает ... но, как ни странно, полосы все еще немного отличаются по ширине. Я отредактировал свой вопрос, чтобы показать, что я имею в виду
Когда ширина полос близка к одному пикселю, неизбежно будут видны небольшие различия. Вы можете либо попробовать рисовать меньше полос, либо увеличить размер фигуры, либо (при сохранении графика в файл) увеличить dpi. См., например. что происходит с буквой m
в этом Статья в Википедии о растеризации шрифтов
@JohanC Спасибо за предложение по увеличению dpi, оно сработало для меня. Не могли бы вы опубликовать ответ, чтобы я мог закрыть вопрос?
Согласно предложению в комментариях, ответ увеличивал dpi при сохранении сюжета.
пожалуйста, предоставьте образец данных как текст, а не изображение