Ausgabe
Ich muss ein Liniendiagramm für das Jahr 2019 und 2020 zeichnen und habe es mit sns.barplot erreicht, aber wie ich bereits erwähnt habe, muss ich dies mit einem Liniendiagramm anzeigen
dfyear=df[(df['Year'] == 2019) | (df['Year'] == 2020)]
sns.lineplot(data=dfyear, x="Year", y="How_many_Landed_on_the_our_Page_and_clicked_on_a_button?",
hue="Which_Place_in_India?")
für die das Problem, das auftritt, mit der Exponentialdarstellung des Jahres zusammenhängt, in der ich möchte, dass nur 2019 und 2020 auf der x-Achse angezeigt werden, und ich habe versucht, dies mit den folgenden Methoden zu erreichen, aber das Diagramm wird immer noch in Exponentialform dargestellt.
plt.ticklabel_format(style='plain', axis='x')
und
from matplotlib.ticker import ScalarFormatter, FormatStrFormatter
ax.xaxis.set_major_formatter(FormatStrFormatter('%.0f'))
Lösung
Sie können dies erreichen, indem Sie einfach die Werte in umwandeln dfyear.Year
in strings
:
dfyear.Year = dfyear.Year.astype(str)
Oder wir können dies direkt an weiterleiten sns.lineplot
, wie in den Kommentaren von @mwaskom erwähnt :
sns.lineplot(data=dfyear.astype({'Year':str}), x="Year",
y="Page visits & button clicked",
hue="Place")
Beispiel df
mit einigen zufälligen Daten:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
rngs = np.random.choice([*np.arange(1E5,6E5,0.5E5)],10, replace=False)
cities = ['Bangalore', 'Chennai', 'Dehradun', 'Indore', 'Pune']
rng = []
for i in range(0,10,2):
lst = rngs[i:i+2]
low, high = np.min(lst), np.max(lst)
rands = list(np.random.randint(low=low, high=high, size=100))
rng.extend(rands)
data = {'Page visits & button clicked': rng, 'Place': np.repeat(cities, 100),
'Year': np.tile(np.repeat([*range(2018,2022)],25), 5)}
df = pd.DataFrame(data)
print(df.head())
Page visits & button clicked Place Year
0 286733 Bangalore 2018
1 417111 Bangalore 2018
2 268098 Bangalore 2018
3 253824 Bangalore 2018
4 398087 Bangalore 2018
Holen Sie sich jetzt das 2019-2020-Slice, ändern Sie das dtype
und wenden Sie es an sns.lineplot
:
dfyear = df[df.Year.isin(range(2019,2021))].copy()
# copy isn't necessary, since `astype` creates a copy itself, but
# for me at least it suppresses a `SettingWithCopyWarning`
dfyear.Year = dfyear.Year.astype(str)
ax = sns.lineplot(data=dfyear, x="Year",
y="Page visits & button clicked",
hue="Place")
sns.move_legend(ax, "upper left", bbox_to_anchor=(1, 1))
plt.show()
# as mentioned above, also possible to simply use:
# `data=dfyear.astype({'Year':str})`
Zufallsergebnis:
Beantwortet von – ouroboros1
Antwort geprüft von – Pedro (FixError Volunteer)